假设我有这样的结果:
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
对象并对其进行处理?
我承认示例代码可能不是最合适的(对于这个问题),但我认为它可以。
发布于 2009-12-11 20:12:23
Scala 2.8为隐含添加了优先级系统。它在此SIP on the new Java arrays中进行了解释
当比较重载方法或隐式方法的两种不同的适用替代方法时,每个方法都会因为具有更具体的参数而得到一分,而在适当的子类中定义则会得到另一分。如果一个替代方案在这两个比较中获得了更多的分数,那么它将“胜出”另一个替代方案。
结论是,如果备选方案具有相同的参数类型,则在子类中定义的参数类型将获胜。因此,我相信您可以像下面这样声明隐式:
trait LowPriorityImplicits {
//lower priority conversions
}
object HighPriorityImplicits extends LowPriorityImplicits {
//higher-order ones here
}
https://stackoverflow.com/questions/1886953
复制相似问题