《Scala 编程》一书规定:
直到 Scala 2.7,这就是故事的结局。每当应用多个隐式转换时,编译器都会拒绝在它们之间进行选择。... Scala 2.8 放宽了这条规则。如果一个可用的转换严格来说比其他的更具体,那么编译器将选择更具体的一个。...如果以下情况之一适用,则一种隐式转换比另一种更具体:
• 前者的参数类型是后者的子类型。
考虑以下情况:
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]?