Scala 2.8の仕様はセクション7.3で述べています(強調表示は私のものです):
暗黙的なパラメーターとメソッドは、ビューと呼ばれる暗黙的な変換を定義することもできます。タイプSからタイプTへのビューは、関数タイプS => Tまたは(=> S)=> Tを持つ暗黙の値、またはそのタイプの値に変換可能なメソッドによって定義されます。ビューは2つの状況で適用されます。
- 式eがタイプTであり、Tが式の予想されるタイプptに準拠していない場合。この場合、eに適用可能で、結果タイプがptに準拠する暗黙のvが検索されます。検索は、暗黙のパラメータの場合と同じように進行します。ここで、暗黙のスコープはT=>ptのいずれかです。そのようなビューが見つかった場合、式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
変換関数が暗黙的に適用されないのはなぜですか?