将隐式变量传递给没有相同名称的类型的特征

时间:2014-06-12 17:40:35

标签: scala

在scala类中,具有隐式构造函数参数DogService的类DogDAO可以使用任何具有相同类型的隐式变量名实例化。

实施例

class DogService(implicit val dogDAO: DogDAO)
implicit val dDAO = new DogDAO
val dogService = new DogService // works

是否可以在不使用相同变量名的情况下将隐式变量传递给特征?

实施例

  trait DogService { implicit def myDAO: DogDAO}
  implicit val dogDAO = new DogDAO
  class AllService(implicit val dogDAO: DogDAO)
  val dogService = new AllService with DogService // myDAO is not defined

1 个答案:

答案 0 :(得分:2)

当您使用implicit val成员定义了一个类时,您还定义了一个带有隐式参数的构造函数,这就是您的第一个示例有效的原因。

然而,与特质完全不同。 Traits不能有构造函数参数,实际上你已经定义了一个常规的隐式方法。除非该类是抽象的,否则此方法必须在实现类中重写。如果“使用相同的变量名”,它的工作原理是因为类构造函数参数中的val声明会自动生成类中的相应项,这会覆盖trait方法。

所以,简而言之,就你所说的意义而言,没有“将隐式变量传递给特质”这样的事情,你就不能做你想做的事。