20

假设我有这个:

class String2(val x:String) {
    def *(times:Int) : String = {
        val builder = new StringBuilder()
        for( i <- 0 until times) {
            builder.append(x)
        }
        builder.toString()
    }
}

现在如果我添加这个隐式:

implicit def gimmeString2(y:String) = new String2(y)

我会得到一个编译错误,因为 stringWrapper 也添加了这个隐式。有没有办法对编译器说“忽略其他隐式,使用这个”,这样我就不必实例化一个String2对象并处理它?

我承认示例代码可能不是最合适的(对于这个问题),但我认为它会做。

4

1 回答 1

34

Scala 2.8 为隐式添加了优先级系统。在这个SIP 中对新的 Java 数组进行了解释:

在比较重载方法或隐式方法的两种不同的适用替代方案时,每个方法都因具有更具体的参数而得一分,而在适当的子类中定义的另一种方法则得一分。如果在这两次比较中获得更多分数,则替代方案“胜过”另一个

得出的结论是,如果备选方案具有相同的参数类型,则在子类中定义的参数类型获胜。因此,我相信您可以如下声明隐含:

trait LowPriorityImplicits {
  //lower priority conversions
}

object HighPriorityImplicits extends LowPriorityImplicits {
  //higher-order ones here
}
于 2009-12-11T12:12:22.647 回答