有没有办法控制默认使用哪个隐式转换?

时间:2009-12-11 09:48:21

标签: scala implicit

假设我有这个:

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对象并对其进行处理?

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

1 个答案:

答案 0 :(得分:34)

Scala 2.8为implicits添加了优先级系统。这在SIP on the new Java arrays中解释了:

  

当比较重载方法或隐式方法的两个不同的适用替代方案时,每个方法获得一个点用于具有更多特定参数,另一个点用于在适当的子类中定义。如果在这两个比较中得到更多的分数,则可以选择“胜过”另一个

总结如果替代品具有相同的参数类型,则在子类中定义 胜。因此,我相信您可以声明隐含如下:

trait LowPriorityImplicits {
  //lower priority conversions
}

object HighPriorityImplicits extends LowPriorityImplicits {
  //higher-order ones here
}