Scala trait可以复制其子类吗?

时间:2018-05-30 20:12:10

标签: scala traits

我想创建一个可以生成其子类副本的特征。子类保证是一个case类,所以应该有一个copy方法。我在这里做错了什么?

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

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

}

1 个答案:

答案 0 :(得分:4)

  

子类保证是案例类

不,不是。 Product可以由非案例类实现。

即使是这样,不同案例类的copy方法是具有不同签名的不同方法,也没有单一的copy方法可以调用。

虽然您可以 使用反射和specialCopy来实现productIterator。大约:

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

这对于具有多个参数列表(包括隐式参数)或内部类的类不起作用。