假设我有这个:
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
对象并为此努力?
我承认示例代码可能不是最合适的(对于这个问题),但我认为它可以。
Scala 2.8 添加了隐式优先级系统。这里面有解释新 Java 阵列上的 SIP http://www.scala-lang.org/sites/default/files/sids/cunei/Thu,%202009-10-01,%2013:54/arrays.pdf:
当比较重载方法或隐式方法的两种不同的适用替代方法时,每个方法因具有更具体的参数而获得一分,并因在正确的子类中定义而获得另一分。如果一个替代方案在这两次比较中获得更多分数,则该替代方案“胜过”另一个方案
结论是如果替代项具有相同的参数类型,则为子类中定义的参数类型
获胜。因此我相信您可以按如下方式声明隐式:
trait LowPriorityImplicits {
//lower priority conversions
}
object HighPriorityImplicits extends LowPriorityImplicits {
//higher-order ones here
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)