次のスカラ コードがあるとします。
trait ValueSource[A] {
def value(a: Int): A
}
trait ValueSourceOps[A] {
def self: Int
def F: ValueSource[A]
def value: A = F.value(self)
}
trait ToValueSourceOps {
implicit def toValueSourceOps[A](index: Int)(implicit F0: ValueSource[A]): ValueSourceOps[A] = new ValueSourceOps[A] {
def self = index
def F: ValueSource[A] = F0
}
}
object Test extends ToValueSourceOps {
def value[A: ValueSource](index: Int): A = toValueSourceOps(index).value
}
上記のコードはうまくコンパイルされますが、最後の行 (オブジェクト Test のメソッド「値」の本体) を次のように変更すると、
def value[A: ValueSource](index: Int): A = index.value
コンパイラは、パラメータ F0: ValueSource[A] の暗黙的な値を見つけることができなかったと不平を言います
私の意見では、def value[A: ValueSource] は暗黙の値 "ValueSource[A]" を持っていることを意味しますが、コンパイルが失敗するのはなぜですか?