Использование shapeless.Witness
правильный синтаксис:
sealed trait Animal
case object Dog extends Animal
case object Cat extends Animal
trait Person {
def name: String
def mostImportantThings(implicit
witness: Witness.Aux[FavoriteAnimal]
): (FavoriteAnimal, String) = (witness.value, name)
protected type FavoriteAnimal <: Animal with scala.Singleton
}
case class DogPerson(override val name: String) extends Person {
override type FavoriteAnimal = Dog.type
}
case class CatPerson(override val name: String) extends Person {
override type FavoriteAnimal = Cat.type
}
DogPerson("A Dog Person").mostImportantThings // (Dog, A Dog Person)
К сожалению, в текущей версии Shapeless (2.3.3) есть ошибка, и этот код не компилируется.Но после fix это так.