在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
答案 0 :(得分:2)
当您使用implicit val
成员定义了一个类时,您还定义了一个带有隐式参数的构造函数,这就是您的第一个示例有效的原因。
然而,与特质完全不同。 Traits不能有构造函数参数,实际上你已经定义了一个常规的隐式方法。除非该类是抽象的,否则此方法必须在实现类中重写。如果“使用相同的变量名”,它的工作原理是因为类构造函数参数中的val
声明会自动生成类中的相应项,这会覆盖trait方法。
所以,简而言之,就你所说的意义而言,没有“将隐式变量传递给特质”这样的事情,你就不能做你想做的事。