【问题标题】:How can I copy a case class with its trait?如何复制具有特征的案例类?
【发布时间】:2021-11-22 21:29:47
【问题描述】:

我有以下几点:

scala> trait Tail
scala> case class Cat(name: String)
scala> val aa = new Cat(name = "bob")
val aa: Cat with Tail = Cat(ben)
scala> val bb = aa.copy(name = "ted")
val bb: Cat = Cat(ted)

为什么bb 没有继承Tail trait?

如何复制 aa 并仍然保留特征?

【问题讨论】:

  • 案例类的复制方法不是虚拟的,不受类型层次结构查找的影响。它的参数和返回类型已设置。

标签: scala case-class


【解决方案1】:

val aa: Cat with Tail = Cat(ben)

鉴于上述行,这不应该发生。我假设你有

scala> val aa = new Cat(name = "ben") with Tail

在这种情况下,它从Cat继承copy,定义为in Scala Language Specification。跟着它,可以看到aa.copy("ted")只是调用了构造函数,返回了new Cat("ted")

如果你想返回Cat with Tail,你可以手动实现:

val aa = new Cat(name = "ben") with Tail {
  override def copy(name: String): Cat with Tail = new Cat(name) with Tail
}

或声明一个单独的类,但没有内置支持。如果将子类设为案例类,它将获得自己的copy 方法,但案例类不能扩展案例类;所以在这种情况下,Cat 不应该是一个案例类。

【讨论】:

    猜你喜欢
    • 2012-10-22
    • 2016-11-26
    • 2014-01-23
    • 2020-11-19
    • 1970-01-01
    • 2011-04-07
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多