Explizite Typkonvertierung in Scala


76

Nehmen wir an, ich habe den folgenden Code:

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

Wie behebe ich die letzte Zeile dieses Codes? Grundsätzlich möchte ich nur das tun, was in einer C-ähnlichen Sprache getan werden würde:

var bar:Dog = (Dog) foo

Antworten:


142

Ich habe das selbst herausgefunden. Es gibt zwei Lösungen:

1) Machen Sie die explizite Besetzung:

var bar:Dog = foo.asInstanceOf[Dog]

2) Verwenden Sie Pattern Matching, um es für Sie zu besetzen. Dies fängt auch Fehler auf:

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

14
Beachten Sie, dass der zweite Weg bei Generika aufgrund der Löschung vom Typ JVM fehleranfällig ist
om-nom-nom

@ om-nom-nom kannst du es ein wenig erklären? Vielen Dank.
Weihong Diao


@ om-nom-nom: Wäre es gültig, 1) und 2) zu kombinieren var bar:Dog = foo match { case x:Dog => foo.asInstanceOf[Dog] case _ => { // Error handling code here } }?
Make42

@ Make42 Sie müssen keine Besetzung machen, verwenden Sie einfach xaus dem Mustervergleich
om-nom-nom
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.