这是Implicit search decision between multiple alternatives的后续行动。我会引用它的代码。
trait A
trait B extends A
caseclass 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)
我从概念上理解为什么atester: Tester[A]
选择btester: Tester[B]
而Tester.test(implicit t: Tester[C])
当6.26.3 overloading resolution
寻找隐含的逆变和特异性时。
我发现很难看到如何根据规范{ Tester[A], Tester[B] }
具体描述这一点。
AFAIK,规范处理需要在三个类别中重载分辨率的标识符或选择e:
此外,该规范描述了通过确定一种替代方案比另一种方案更具特异性而计算的相对权重。
我首先不明白哪个类别适合替代方案。如果它们是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[T <: A] = new Tester[T] { override def test (a: T) = true }
implicit def btester[T <: B] = new Tester[T] { override def test (b: T) = false }
}
val c = C()
Tester.test(c)
,那么在我看来(2)可能是它的规则 -
重载分辨率再次应用于整个表达式 E [targs]
- 看起来又把球扔回去了。而且我也没有发现规范中的哪个位置如何比较A和B.
{ atester[T <: A]: Tester[T], btester[T<: B]: Tester[T] }
我认为替代方案是两种多态方法: {{1}}。它看起来属于(1)类别。但我不清楚进一步推理。