Вот класс типов пример
sealed trait Pet
case object Dog extends Pet
case object Cat extends Pet
case object Fish extends Pet
trait PetFactory[P <: Pet] {
def getPet(p: P): P
}
object PetFactory {
def getPet[P <: Pet](p: P)(implicit petFactory: PetFactory[P]): P = petFactory.getPet(p)
implicit val dogFactory: PetFactory[Dog.type] = (dog: Dog.type) => dog
implicit val catFactory: PetFactory[Cat.type] = (cat: Cat.type) => cat
implicit val fishFactory: PetFactory[Fish.type] = (fish: Fish.type) => fish
}
import PetFactory._
getPet(Dog)
getPet(Cat)
getPet(Fish)
, который выводит
res0: Dog.type = Dog
res1: Cat.type = Cat
res2: Fish.type = Fish
Обратите внимание, что тип одиночного объекта O
равен O.type
, дляпример
val fish: Fish.type = Fish