下面的 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
,而不是将它们视为等效且因此模棱两可的选项?