Я пытаюсь построить завод для реализации общей черты.Как создать фабрику для параметризованного класса?
Учитывая мою модель домена:
trait Person
case class Man(firstName: String, lastName: String) extends Person
case class Woman(firstName: String, lastName: String) extends Person
Я создал репозиторий для тех классов, как это:
trait Repository[T <: Person] {
def findAll(): List[T]
}
class ManRepository extends Repository[Man] {
override def findAll(): List[Man] = {
List(
Man("Oliver", "Smith"),
Man("Jack", "Russel")
)
}
}
class WomanRepository extends Repository[Woman] {
override def findAll(): List[Woman] = {
List(
Woman("Scarlet", "Johnson"),
Woman("Olivia", "Calme")
)
}
}
До сих пор так хорошо, некоторые довольно простые классы. Но я хотел создать фабрику для создания экземпляра этих репозиториев в зависимости от некоторых параметров.
object RepositoryFactory {
def create[T <: Person](gender: String): Repository[T] = {
gender match {
case "man" => new ManRepository()
case "woman" => new WomanRepository()
}
}
}
Но этот последний кусок не компилируется. Если я опускаю явный возвращаемый тип фабрики, он компилируется, но возвращает репозиторий типа Repository[_1]
вместо Repository[Man]
Я не могу найти подходящее решение, у любого из вас, у вас есть несколько советов для меня?
Обычно полезно сказать, что сообщение об ошибке вместо «не будет компилироваться». –