Явне перетворення типів у Scala


76

Скажімо, у мене є такий код:

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

Як виправити останній рядок цього коду? В основному, я просто хочу зробити те, що мовою, подібною до С, було б зроблено:

var bar:Dog = (Dog) foo

Відповіді:


142

Я сам це зрозумів. Є два рішення:

1) Виконайте явний акторський склад:

var bar:Dog = foo.asInstanceOf[Dog]

2) Використовуйте відповідність шаблону, щоб створити його для вас, це також виявляє помилки:

var bar:Dog = foo match {
  case x:Dog => x
  case _ => {
    // Error handling code here
  }
}

14
Зверніть увагу, що другий спосіб схильний до помилок у дженериках через стирання типу JVM
om-nom-nom

@ om-nom-nom, ти можеш трохи це пояснити? Дякую.
Weihong Diao


@ om-nom-nom: Чи правильно було б поєднувати 1) та 2) до var bar:Dog = foo match { case x:Dog => foo.asInstanceOf[Dog] case _ => { // Error handling code here } }?
Make42

@ Make42, вам не потрібно робити кастинг, просто використовуйте xзіставлення зразків
om-nom-nom
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.