リッチロンのスーパータイプが予想される場合、なぜロングからリッチロンへの暗黙的な変換が適用されないのですか?

StackOverflow https://stackoverflow.com/questions/3586044

  •  01-10-2019
  •  | 
  •  

質問

Scala 2.8 Specは、セクション7.3で述べています(ハイライトは私のものです):

暗黙的なパラメーターと方法は、ビューと呼ばれる暗黙的な変換を定義することもできます。タイプSからタイプTへのビューは、関数タイプs => tまたは(=> s)=> tを持つ暗黙の値、またはそのタイプの値に変換可能なメソッドによって定義されます。ビューは2つの状況で適用されます。

  1. 式eがタイプtの場合、そしてt 適合しません 式の予想されるタイプptに。この場合、eとeと その結果タイプが適合します PTへ。検索は、暗黙のパラメーターの場合のように進行します。ここで、暗黙的なスコープはt => ptの1つです。そのようなビューが見つかった場合、式eはv(e)に変換されます。

[...]

上記と次の事実を考えると、

  1. Long のサブタイプではありません java.lang.Comparable[Long], 、すなわち 適合しません 入力し T どこ T <: java.lang.Comaparable[Long]
  2. Predef 含む implicit def longWrapper (x: Long) : RichLong
  3. 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")。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top