4

Scala 2.8の仕様はセクション7.3で述べています(強調表示は私のものです):

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

  1. 式eがタイプTであり、Tが式の予想されるタイプptに準拠していない場合。この場合、eに適用可能で、結果タイプがptに準拠する暗黙のvが検索されます。検索は、暗黙のパラメータの場合と同じように進行します。ここで、暗黙のスコープはT=>ptのいずれかです。そのようなビューが見つかった場合、式eはv(e)に変換されます。

[...]

上記および以下の事実を前提としています。

  1. Longのサブタイプではありませんjava.lang.Comparable[Long]。つまり、次のタイプに準拠していませんTT <: java.lang.Comaparable[Long]
  2. Predef含むimplicit def longWrapper (x: Long) : RichLong
  3. RichLongのサブタイプですjava.lang.Comparable[Long]。つまり、次のタイプに準拠します。TT <: 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

変換関数が暗黙的に適用されないのはなぜですか?

4

1 に答える 1

5

<%コンパイラに暗黙の変換を検索して適用させるには、view-bound()を使用する必要があります。

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

ビューバウンドの詳細については、このページを参照してください(「ビューバウンド」の場合はCtrl + F)。

于 2010-08-27T16:19:59.827 に答える