我正在拼凑这个问题的答案:Scala mixin to class instance,我展示了一种将另一个特征或类实例“混合”到现有实例的方法:
case class Person(name: String)
val dave = Person("Dave")
val joe = Person("Joe")
trait Dog { val dogName: String }
val spot = new Dog { val dogName = "Spot" }
implicit def daveHasDog(p: dave.type) = spot
dave.dogName //"Spot"
joe.dogName //error: value dogName is not a member of Person
所以在局部隐式def之后,dave
可以有效地作为一个Person with Dog
. 我的问题是,如果我们想定义一个方法,Person
它只在Person
有 a 的地方接受一个实例Dog
,我们该怎么做?
我可以定义一个方法,例如
def showDog(pd: Person with Dog) = pd.name + " shows " + pd.dogName
然而这并没有好处,dave
因为他仍然只是一个Person
,尽管他有隐含的变形能力。
我尝试定义
trait Dog [T] { val dogName: String }
val spot = new Dog [dave.type] { val dogName = "Spot" }
def showDog(p: Person)(implicit dog: Dog[p.type]) = ...
但这不合法,给予error: illegal dependent method type
. 有任何想法吗?