是否可以更新实现共同特征的任何案例类的字段

fcs*_*fcs 6 scala case-class shapeless

让我们假设我们有一个共同的特质模型.

trait Model {
  def id: String
  def updated: Date
}
Run Code Online (Sandbox Code Playgroud)

我们有2个案例类来扩展这个特性.

case class C1(id: String, updated: Date, foo: String) extends Model
case class C2(id: String, updated: Date, bar: Int) extends Model
Run Code Online (Sandbox Code Playgroud)

是否可以编写如下所示的实用程序函数,该函数将Model作为参数并返回带有更新字段的更新值的副本?

object Model {
    def update[T <: Model](model: T): T = {
        model.copy(updated = new Date) // This code does not compile.
    }
}
Run Code Online (Sandbox Code Playgroud)

vpt*_*ron 1

copy是在您的案例类上定义的方法。不是基于你的基本特质Model。如果你有这样的情况怎么办:

trait Model {
  def id: String
  def updated: Date
}

case class C1(id: String, updated: Date, foo: String) extends Model
case class C2(id: String, updated: Date, bar: Int) extends Model
class NotACaseClass(val id: String, val updated: Date) extends Model 
Run Code Online (Sandbox Code Playgroud)

NotACaseClass是 的一个非常有效的子代Model,您可以将它的实例传递给您的update函数,但祝您找到copy方法好运:)

  • 它回答了“为什么它不起作用”,但没有提供给定问题的解决方案。 (2认同)