Scala:适用多个隐式转换时

时间:2013-03-25 05:10:09

标签: scala implicit-conversion

“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吗?

1 个答案:

答案 0 :(得分:1)

来自Scala语言规范:

  

如果有几个符合条件的参数与隐式匹配   参数的类型,将使用规则选择最具体的类型   静态重载决策(§6.26.3)。如果参数有一个   默认参数并且没有隐式参数可以找到默认值   使用了参数。

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