Я собирал ответ на этот вопрос: 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
. Любые идеи?