2

《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]?

4

1 回答 1

1

来自 Scala 语言规范:

如果有几个符合条件的参数与隐式参数的类型匹配,则将使用静态重载解析规则(第 6.26.3 节)选择一个最具体的参数。如果参数具有默认参数并且找不到隐式参数,则使用默认参数。

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

于 2013-03-26T12:30:47.493 回答