trait Eq[-A] {
def eq(a: A, b: A): Boolean
}
object Eq {
implicit object IntEq extends Eq[Int] {
def eq(a: Int, b: Int) = a == b
}
}
trait Supertrait[+A]
object Supertrait {
implicit def Eq[A: Eq]: Eq[Supertrait[A]] = ???
}
trait Subtrait[+A] extends Supertrait[A]
object Subtrait {
implicit def Eq[A: Eq]: Eq[Subtrait[A]] = ???
}
def f[A](x: Subtrait[A])(implicit ev: Eq[Subtrait[A]]) = ???
f(new Subtrait[Int] {})
编译此代码时,会发生以下错误:
Error:(32, 4) ambiguous implicit values:
both method Eq in object Supertrait of type [A](implicit evidence$1: Eq[A])Eq[Supertrait[A]]
and method Eq in object Subtrait of type [A](implicit evidence$2: Eq[A])Eq[Subtrait[A]]
match expected type Eq[Subtrait[Int]]
f(new Subtrait[Int] {})
^
为什么implicit def
随播广告系列中Subtrait
的优先级高于Supertrait
中的implicit def
优先级?
我希望子版本的伴随对象中的LowPriorityImplicits
优先级高于超级特征中的var switcharoo = function(whateverObject){
for (var i in whateverObject){
if (whateverObject.hasOwnProperty(i)){
alert(i + "redacted" + whateverObject[i]);
}
}
return whateverObject;
};
。
alert(i + "this is a string" + whateverObject[i]);
技巧也不起作用。请参阅Enforcing precedence in implicit instances in Scala。
答案 0 :(得分:0)
您的代码似乎违反了非歧义规则的含义。
来自 Scala编程,第1版:
非歧义规则:仅在存在时插入隐式转换 没有其他可能的插入转换。如果编译器有两个 修复x + y的选项,比如使用convert1(x)+ y或convert2(x) + y,然后它将报告错误并拒绝在它们之间进行选择。可以定义某种最佳匹配"规则 喜欢某些转换而不是其他转换。但是,这样的选择导致了 真的很模糊的代码。想象一下编译器选择convert2,但是你 是文件的新手,只知道convert1 - 你可以花一个 很多时候都在考虑采用不同的转换方式!
可以找到完整的文字here。