2012-06-04 5 views
4

У меня есть устаревшее сообщение в моей системе, и я хотел бы иметь возможность отображать его в новой версии сообщение в моей системе.Перегрузка класса case в Scala

Почему я не могу перегрузить класс моего класса?

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) 

Этот код не компилируется. :(

ответ

5

Вы должны явно вызвать конструктор с помощью new оператора:

val converted = new NewMessage(msg) 

Это работает, потому что вы на самом деле определение второго конструктора в NewMessage в то время как обычный:

NewMessage(1, 2, 3) 

переводится на:

NewMessage.apply(1, 2, 3) 
+0

Уверены ли вы? он говорит, что не может решить конструктор. – Terenced

+1

@ Подчеркнуто: хорошо ... да. Я только что проверил его с помощью Scala 2.9.1 и компилирует код, добавив оператор 'new' просто отлично –

+0

Это сработало! Благодаря! : D – Terenced

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) 
Смежные вопросы