Может ли черта Scala копировать свой подкласс? - PullRequest
0 голосов
/ 30 мая 2018

Я хочу создать черту, которая может производить копию своего подкласса.Подкласс гарантированно является классом case, поэтому должен иметь метод copy.Что я здесь не так делаю?

trait Copyable[C <: Copyable[C] with Product] {

  def specialCopy: C =
    this.asInstanceOf[C].copy() // doesn't compile

}

1 Ответ

0 голосов
/ 31 мая 2018

Подкласс гарантированно будет классом дела

Нет, это не так.Product может быть реализовано неклассовыми классами.

И даже если бы copy методы разных классов case были разными методами с разными сигнатурами, нет единого copy метода для вызова.

Хотя вы можете в основном реализовать specialCopy, используя отражение и productIterator.Примерно:

 def specialCopy = getClass.getConstructors()(0).newInstance(this.asInstanceOf[Product].productIterator.asInstanceOf[Iterator[Object]].toSeq: _*)

Это не будет работать для классов с более чем одним списком параметров (включая неявные параметры) или для внутренних классов.

...