【发布时间】:2012-05-12 21:47:09
【问题描述】:
我正在尝试使用隐式参数将依赖项“注入”到我的类中,如下所示:
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 }
}
这里,编译器从Bar 的伴随对象中的隐式val 向FooTrait 提供隐式参数。这样做:
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 的伴随对象来解析隐式参数。这个blog post 声明:
对于应用隐式值有非常严格的规则 到一个隐式参数。一个简单的思考方法是 将使用“最接近”的定义。局部范围,封闭类, 父类,所需类型的伴生对象。
我是否遗漏了什么,或者这是 scalas 隐式参数的已知限制?
【问题讨论】: