0

次のスカラ コードがあるとします。

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]" を持っていることを意味しますが、コンパイルが失敗するのはなぜですか?

4

1 に答える 1

0

Ainはinと関係toValueSourceOpsないため、推論が困難になります。私にとって本当の問題は、メソッドを明示的に呼び出すとなぜ機能するのかということです。Avalue

toValueSourceOpが明示的に呼び出された場合、それA唯一の暗黙的に利用可能なものであるため、同じことを推測する必要があると思います。

于 2013-03-11T09:51:15.900 に答える