2

本「Programming in Scala」では次のように指定されています。

Scala 2.7 までは、これで話は終わりでした。複数の暗黙的な変換が適用されるたびに、コンパイラはそれらから選択することを拒否しました。... Scala 2.8 ではこのルールが緩和されています。利用可能な変換の 1 つが他の変換より厳密に具体的である場合、コンパイラはより具体的な変換を選択します。... 次のいずれかが当てはまる場合、ある暗黙の変換は別の変換よりも具体的です。

• 前者の引数の型は、後者のサブタイプです。

次のケースを検討してください。

object Encoder {
  implicit def fromInt(x: => Int) = { println("int"); new Encoder }
  implicit def fromIntArray(x: => Array[Int]) = { println("int array"); new Encoder }
  implicit def fromGenericArray[T](x: => Array[T])(implicit subencoder: (=> T) => Encoder) = {
    println("generic array")
    subencoder(x(0))
    new Encoder
  }
}
val e: Encoder = Array(1)

ここで複数の変換が適用される可能性がありますが、fromIntArray がピックアップされているようです。fromIntArray が存在しない場合、fromGenericArray が選択されます。私の質問は、上記のルールが適用されるこの特定のケースで、fromIntArray が Array[Int] に適用され、fromGenericArray が他のすべての Array[T] に適用されることを安全に期待できますか?

4

1 に答える 1

1

Scala 言語仕様から:

暗黙のパラメーターの型に一致する適切な引数が複数ある場合は、静的なオーバーロードの解決 (§6.26.3) の規則を使用して、最も具体的な引数が選択されます。パラメータにデフォルトの引数があり、暗黙の引数が見つからない場合は、デフォルトの引数が使用されます。

http://www.scala-lang.org/docu/files/ScalaReference.pdf

于 2013-03-26T12:30:47.493 に答える