4

私はこの質問への答えをまとめていました: 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場合にのみインスタンスを取るメソッドを定義したい場合、どうすればよいのでしょうか?PersonDog

次のようなメソッドを定義できます

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ます。何か案は?

4

1 に答える 1

5

でコンパイルすると-Ydependent-method-types、元のコードは次の定義で機能しますshowDog

scala> def showDog(p: Person)(implicit ev: p.type => Dog) = p.name + " shows " + p.dogName
showDog: (p: Person)(implicit ev: p.type => Dog)java.lang.String

scala> showDog(dave)
res1: java.lang.String = Dave shows Spot
于 2012-04-17T23:24:14.140 に答える