Явное преобразование типов в Scala

Допустим, у меня есть следующий код:

abstract class Animal
case class Dog(name:String) extends Animal
var foo:Animal = Dog("rover")
var bar:Dog = foo //ERROR!

Как исправить последнюю строчку этого кода? По сути, я просто хочу сделать то, что на языке C было бы сделано:

var bar:Dog = (Dog) foo

person Kevin Albrecht    schedule 05.10.2008    source источник


Ответы (1)


Я сам в этом разобрался. Есть два решения:

1) Сделайте явное приведение:

var bar:Dog = foo.asInstanceOf[Dog]

2) Используйте сопоставление с образцом, чтобы использовать его для вас, это также выявляет ошибки:

var bar:Dog = foo match {
  case x:Dog => x
  case _ => {
    // Error handling code here
  }
}
person Kevin Albrecht    schedule 05.10.2008
comment
Обратите внимание, что второй способ подвержен ошибкам для дженериков из-за стирания типа JVM. - person om-nom-nom; 09.04.2012
comment
@ om-nom-nom не могли бы вы объяснить это немного? Благодарю. - person Weihong Diao; 06.02.2014
comment
@WeihongDiao, пожалуйста, см. stackoverflow.com/questions/1094173/ - person om-nom-nom; 07.02.2014
comment
@ om-nom-nom: допустимо ли объединить 1) и 2) в var bar:Dog = foo match { case x:Dog => foo.asInstanceOf[Dog] case _ => { // Error handling code here } }? - person Make42; 14.10.2016
comment
@ Make42 вам не нужно делать приведение, просто используйте x из сопоставления с образцом - person om-nom-nom; 15.10.2016
comment
@ om-nom-nom: Вы сказали, что сопоставление с образцом не подвержено ошибкам - я думал, что приведение может быть таким, или я ошибся? Таким образом, я подумал, что их сочетание может устранить всю подверженность ошибкам? - person Make42; 17.10.2016
comment
@ Make42 checkout stackoverflow.com/questions/16056645/ и stackoverflow.com/questions/32246734/, чтобы получить представление о возможных проблемах - person om-nom-nom; 17.10.2016