2013-03-25 186 views
2

书“编程在斯卡拉”规定:斯卡拉:当多个隐式转换申请

向上穿过斯卡拉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被拾起。如果来自IntArray不存在,则从GenericArray中选择。我的问题是,在上述规则适用的这种特定情况下,我能否安全地期望来自数组的IntArray将适用于所有其他数组[T]的Array [Int]和来自GenericArray?

+1

我会说是的,但读Scala语言规范,它会以很大的篇幅来解释隐含的冲突解决:-) – Felix 2013-03-25 08:24:01

+0

看起来我不得不这样做。感谢您的建议:) – 2013-03-26 09:47:11

回答

1

从Scala语言规范:

如果有匹配隐含 参数的类型,最特殊的一个会使用 静态重载决议规则来选择其中几个符合条件的参数(§6.26.3 )。如果该参数具有默认参数 ,并且不能找到隐式参数,则使用默认的 参数。

​​