私はこの質問への答えをまとめていました: 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
したがって、ローカルの暗黙的な定義の後、dave
として効果的に使用できますPerson with Dog
。私の質問は、 が を持つPerson
場合にのみインスタンスを取るメソッドを定義したい場合、どうすればよいのでしょうか?Person
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
ます。何か案は?