在選擇最具體的類型時,是否有任何方法可以在類型類中使用多個合適的替代方法,而不會產生分歧的隱式擴展?它看起來像這樣多個替代方案之間的隱式搜索決策
trait A
trait B extends A
case class C extends B
trait Tester[-T] {def test (t : T) : Boolean}
object Tester{
def test[T] (t : T)(implicit tester : Tester[T]) = tester.test(t)
implicit def ATester = new Tester[A] {
override def test (a : A) = true
}
implicit def BTester = new Tester[B] {
override def test (b : B) = false
}
}
val c = C()
Tester.test(c)
我想這產生假像C更接近,而不是A到B的繼承層次。
我從你的帖子中得到我的例子應該工作,對吧?但事實並非如此。它抱怨分歧擴張。 –
您的示例在Scala 2.10.1下爲我編譯並運行時沒有錯誤或警告,您是什麼意思?「它抱怨」?選擇Tester [A]並打印爲真是正確的。 –
我可以驗證它是否適用於2.10.1並解析爲ATester。爲了讓BTester覆蓋ATester,請根據@ axel22的答案嘗試優先考慮您的含義......看起來現在已經消失了。遺憾的是,我認爲他是對的,但是他的BTester實例返回'true'...無論如何,搜索'LowPriorityImplicits'並查看Predef作爲示例。 – nadavwr