Scala中的case class重载

4
我在系统中有一条旧信息,我希望能够将其映射到系统中的新版本信息。
为什么不能重载我的案例类?
case class Message(a:Int, b:Int)
case class NewMessage(a:Int, b:Int, c:Int) {
  def this(msg : Message) = this(a = msg.a, b = msg.b, c = 0)
}
val msg = Message(1,2)
val converted = NewMessage(msg)

这段代码似乎无法编译。:(

2个回答

11

你正在重载构造函数,而你想要做的是重载apply方法。你可以在伴生对象上实现这个:

case class NewMessage(a: Int, b: Int, c: Int) 

object NewMessage {
  def apply(msg: Message) = new NewMessage(a = msg.a, b = msg.b, c = 0)
}

val converted = NewMessage(msg)

7

您必须使用new操作符显式调用构造函数:

val converted = new NewMessage(msg)

这是因为在NewMessage中,您实际上定义了第二个构造函数,而不是普通的构造函数:

NewMessage(1, 2, 3)

被翻译为:

NewMessage.apply(1, 2, 3)

1
@Terenced:嗯...是的。我刚用Scala 2.9.1检查了一下,只需添加new运算符即可编译代码。 - Tomasz Nurkiewicz
1
请说明您添加了“new”。我试了几分钟才发现与原始代码的区别。 - ziggystar
@ziggystar:已添加,谢谢。请注意,您可以(并且应该)修改 SO 上的任何帖子。 - Tomasz Nurkiewicz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接