本「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] に適用されることを安全に期待できますか?