【发布时间】:2013-04-06 14:44:33
【问题描述】:
下面的 Scala 示例显示了一种情况,其中所需的隐式参数(TC[C] 类型)可以由范围内的两个隐式方法提供,a 和 b。但是在运行时,不会产生歧义,并且会打印“B”。
object Example extends App{
trait A
trait B extends A
class C extends B
class TC[X](val label: String)
implicit def a[T <: A]: TC[T] = new TC[T]("A")
implicit def b[T <: B]: TC[T] = new TC[T]("B")
println(implicitly[TC[C]].label)
}
请注意,隐式方法a 和b 之间的唯一区别是类型边界,它们都可以匹配TC[C]。如果方法 b 被移除,那么 a 会被隐式解析。
虽然我发现这种行为在实践中很方便,但我想了解它是指定的语言功能,还是只是实现的怪癖。
是否存在编译器优先考虑b 而不是a 的语言规则或原则,而不是将它们视为等价的因此模棱两可的选项?
【问题讨论】: