リッチロンのスーパータイプが予想される場合、なぜロングからリッチロンへの暗黙的な変換が適用されないのですか?
-
01-10-2019 - |
質問
Scala 2.8 Specは、セクション7.3で述べています(ハイライトは私のものです):
暗黙的なパラメーターと方法は、ビューと呼ばれる暗黙的な変換を定義することもできます。タイプSからタイプTへのビューは、関数タイプs => tまたは(=> s)=> tを持つ暗黙の値、またはそのタイプの値に変換可能なメソッドによって定義されます。ビューは2つの状況で適用されます。
- 式eがタイプtの場合、そしてt 適合しません 式の予想されるタイプptに。この場合、eとeと その結果タイプが適合します PTへ。検索は、暗黙のパラメーターの場合のように進行します。ここで、暗黙的なスコープはt => ptの1つです。そのようなビューが見つかった場合、式eはv(e)に変換されます。
[...]
上記と次の事実を考えると、
Long
のサブタイプではありませんjava.lang.Comparable[Long]
, 、すなわち 適合しません 入力しT
どこT <: java.lang.Comaparable[Long]
Predef
含むimplicit def longWrapper (x: Long) : RichLong
RichLong
のサブタイプですjava.lang.Comparable[Long]
, 、すなわち 適合 入力しT
どこT <: java.lang.Comaparable[Long]
暗黙の変換が適用されることを期待します Long
遭遇し、サブタイプがあります java.lang.Comparable[Long]
期待されています。でも:
scala> def test[T <: java.lang.Comparable[Long]](c: T) = println(c)
test: [T <: java.lang.Comparable[Long]](c: T)Unit
scala> test(12L)
<console>:7: error: inferred type arguments [Long] do not conform to method test's type parameter bounds [T <: java.lang
.Comparable[Long]]
test(12L)
^
値が明示的に変換された場合、結果は予想通りです。
scala> test(longWrapper(12L))
12
変換関数が暗黙的に適用されないのはなぜですか?
解決
ビューバウンドを使用する必要があります(<%
)コンパイラに暗黙の変換を探して適用する。
scala> def test[T <% java.lang.Comparable[Long]](c: T) = println(c)
test: [T](c: T)(implicit evidence$1: (T) => java.lang.Comparable[Long])Unit
scala> test(12L)
12
ビューバウンドの詳細を読むことができます これ page(ctrl+f for "View Bound")。
所属していません StackOverflow