“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 [T]的Array [Int]和fromGenericArray吗?
答案 0 :(得分:1)
来自Scala语言规范:
如果有几个符合条件的参数与隐式匹配 参数的类型,将使用规则选择最具体的类型 静态重载决策(§6.26.3)。如果参数有一个 默认参数并且没有隐式参数可以找到默认值 使用了参数。