получить правильный тип возврата из типизированной функции не удается - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь получить правильный тип с помощью типизированной функции, например:

sealed trait Pet
case object Dog extends Pet
case object Cat extends Pet
case object Fish

def getPet[P >: Pet](pet: P) : P = {
  pet match{
    case Dog => Dog
    case Cat => Cat
  }
}

val d: Dog = getPet(Dog)//not compiled

Есть идеи?

1 Ответ

6 голосов
/ 22 октября 2019

Вот класс типов пример

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...