我正在尝试使用隐式参数将依赖项“注入”到我的类中,如下所示:
trait Bar {
def m:String
}
object Bar {
implicit val objBar = new Bar{ val m = "from object" }
}
trait FooTrait {
def aBar(implicit bar:Bar) = bar
def go = { aBar.m }
}
在这里,编译器从伴随对象FooTrait
中的隐式 val提供隐式参数。Bar
这样做:
scala> println((new FooTrait{}).go)
from object
给了我我期望的结果。但是,如果我将 FooTrait 和另一个特征混合在一起,例如:
trait SuperFoo {
implicit val superBar = new Bar{ val m = "from super" }
}
结果是一样的:
scala> println((new FooTrait with SuperFoo).go)
from object
我认为编译器会SuperFoo
在尝试通过检查Bar
伴随对象来解析隐式参数之前查看。这篇博文指出:
对于将隐式值应用于隐式参数有非常严格的规则。考虑它的一种简单方法是使用“最接近”的定义。本地范围、封闭类、父类、所需类型的伴随对象。
我是否遗漏了什么,或者这是 scalas 隐式参数的已知限制?