2013-10-08 3 views
0

У меня есть черта и несколько классов дел, расширяющих эту черту.case classes return Продукт вместо фактического типа

sealed trait Bird 
case class Eagle(age: Int) extends Bird 
case class Sparrow(price: Double) extends Bird 

Если я делаю что-то, что я бы ожидать, чтобы вернуть Черту как тип, как

val result = "test" match { 
    case s:String if s startsWith "t" => Eagle(5) 
    case _ => Sparrow(2) 
} 

я получаю вместо этого Product типа.

> result: Product with Serializable with Bird = Eagle(5) 

Я понимаю Product это то, что все классы случай расширения. Но я не знаю, что нужно делать с Product, как я могу получить Bird или даже Eagle?

ответ

5

Вы можете просто игнорировать аспекты, о которых вы не заботитесь. result a Bird, поэтому используйте его как один. То, что это также Product и Serializable не имеет отношения к делу (если вы этого не хотите). Вы можете сделать это явно указав его ожидаемый тип:

val result: Bird = "test" match { 
    case s:String if s startsWith "t" => Eagle(5) 
    case _ => Sparrow(2) 
} 

Выдает:

result: Bird = Eagle(5) 

Или, вы можете назначить его в другую переменную типа Bird, или просто ожидать, что это будет Bird и заряд , вызывающие методы, определенные на основании Bird, передавая его в качестве аргумента функции, принимающей параметр типа Bird и т. д.

Смежные вопросы