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)

このコードはコンパイルできないようです。:(

4

2 に答える 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)
于 2012-06-04T21:32:37.933 に答える
6

new演算子を使用してコンストラクターを明示的に呼び出す必要があります。

val converted = new NewMessage(msg)

NewMessage通常の whileで実際に 2 番目のコンストラクターを定義しているため、これは機能します。

NewMessage(1, 2, 3)

は次のように翻訳されます。

NewMessage.apply(1, 2, 3)
于 2012-06-04T21:22:17.280 に答える