假设我有这个:
class String2(val x:String) {
def *(times:Int) : String = {
val builder = new StringBuilder()
for( i <- 0 until times) {
builder.append(x)
}
builder.toString()
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加这个隐含:
implicit def gimmeString2(y:String) = new String2(y)
Run Code Online (Sandbox Code Playgroud)
我会得到一个编译错误,因为stringWrapper也添加了这个隐式.有没有办法说编译器"忽略其他含义,使用它",这样我就不必实例化一个String2
对象并对其进行处理?
我承认示例代码可能不是最合适的(对于这个问题),但我认为它会做.
oxb*_*kes 34
Scala 2.8为implicits添加了优先级系统.在这个SIP中解释了新的Java阵列:
当比较重载方法或隐式方法的两个不同的适用替代方案时,每个方法获得一个点用于具有更多特定参数,另一个点用于在适当的子类中定义.如果在这两个比较中得到更多的分数,则另一个"胜利"胜过另一个
得出结论,如果替代品具有相同的参数类型,则子类中定义的参数类型会获胜.因此,我相信您可以声明隐含如下:
trait LowPriorityImplicits {
//lower priority conversions
}
object HighPriorityImplicits extends LowPriorityImplicits {
//higher-order ones here
}
Run Code Online (Sandbox Code Playgroud)