Можно ли указать черту для объекта-компаньона? - PullRequest
0 голосов
/ 01 октября 2019

Допустим, у меня есть это:

trait FormData

case class DepartmentData(id: Long, title: String) extends FormData

и этот объект-компаньон:

object DepartmentData {
  def empty: DepartmentData = ???
  def from(value: SomeKnownType): DepartmentData = ???
}

Я хотел бы убедиться, что все классы, реализующие черту FormData, иметь два метода empty и from в своем объекте-компаньоне.

1 Ответ

2 голосов
/ 01 октября 2019

Я не думаю, что мы можем сделать это напрямую, однако попробуйте тип класса решение, подобное этому

trait FormData
case class DepartmentData(id: Long, title: String) extends FormData
case class EmployeeData(id: Long, title: String) extends FormData

trait SomeKnownType

trait FormDataFactory[T <: FormData] {
  def empty: T
  def from(value: SomeKnownType): T
}

object FormDataFactory {
  def empty[T <: FormData](implicit ev: FormDataFactory[T]): T = ev.empty
  def from[T <: FormData](value: SomeKnownType)(implicit ev: FormDataFactory[T]): T = ev.from(value)

  implicit object fooDepartmentData extends FormDataFactory[DepartmentData] {
    override def empty: DepartmentData = ???
    override def from(value: SomeKnownType): DepartmentData = ???
  }

  implicit object fooEmployeeData extends FormDataFactory[EmployeeData] {
    override def empty: EmployeeData = ???
    override def from(value: SomeKnownType): EmployeeData = ???
  }
}

Теперь звоните

FormDataFactory.empty[DepartmentData]
FormDataFactory.empty[EmployeeData]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...