int Wie werfe ich dies zu einer Int und nicht Some(Int)
Cast Option [Alle]
val a: Option[Any] = Some(1)
Ich versuchte toInt
und es gab einen Fehler value toInt is not a member of Option[Any]
int Wie werfe ich dies zu einer Int und nicht Some(Int)
Cast Option [Alle]
val a: Option[Any] = Some(1)
Ich versuchte toInt
und es gab einen Fehler value toInt is not a member of Option[Any]
Sie könnten a.get.asInstanceOf[Int]
tun, aber es ist unsicher. Ein besserer Weg wäre, die Typinformation beizubehalten, d. H. Unter Verwendung eines Option[Int]
anstelle eines Option[Any]
. Dann müssten Sie das Ergebnis nicht mit asInstanceOf
umwandeln.
val a:Option[Int] = Some(1)
val i = a.get
Mit get
ist direkt unsicher da, wenn die Option
ein None
ist eine Ausnahme ausgelöst wird. So ist die Verwendung von getOrElse
sicherer. Oder Sie können die Mustererkennung auf a
verwenden, um den Wert zu erhalten.
val a:Option[Any] = Some(1) // Note using Any here
val i = (a match {
case Some(x:Int) => x // this extracts the value in a as an Int
case _ => Int.MinValue
})
Mit .asInstanceOf
Methode
a.getOrElse(0).asInstanceOf[Int]
Ich muss darauf hinweisen, dass dies unsicher ist cast: Wenn Ihre Option nicht Int enthält, werden Sie runt Ime Ausnahme.
Der Grund, warum Sie es nicht werfen können, ist, weil Sie nicht werfen sollen. Während statische typisierte Programmiersprachen es Ihnen erlauben, manuell zwischen einem Typ und dem anderen zu wechseln, ist der beste Vorschlag, den ich Ihnen geben kann, diese Features zu vergessen.
Wenn Sie insbesondere das Beste aus jeder Programmiersprache herausholen möchten, versuchen Sie, einen geeigneten Benutzer zu erstellen, und wenn eine Sprache nicht zur gewünschten Verwendung passt, wählen Sie einfach eine andere Sprache (z. B. eine dynamisch eingegebene). :
Wenn Sie machen werfen Sie einen potenziellen Fehler zur Kompilierzeit drehen, die wir wie, weil es einfach eine Classcast zu lösen, in, die wir, weil es zur Laufzeit erfolgt nicht wie . Wenn Sie Scans in Scala verwenden müssen, verwenden Sie sehr wahrscheinlich ein falsches Muster.
Oder Sie verwenden (schlecht gestaltete) Java-Bibliotheken ... – ziggystar
Während ich die Stimmung zu schätzen, in realen Projekten, sind die Dinge nicht immer so schwarz und weiß. Es gibt einen legitimen Bedarf für mich, dies zu tun, da es einer von vier Typen sein könnte, die von der zugrunde liegenden API von Drittanbietern zurückgegeben werden. – Bob
Dies ist ein sehr schwacher Mechanismus. Sie können das wahrscheinlich auch mit besseren Mustern erledigen ... Warum versuchen Sie nicht zu erklären, was Sie tun möchten? – Edmondo1984
Vergiss das bisschen über Casting; Mustervergleich ist eindeutig der Weg zu gehen –
Ich stimme zu. Pattern-Matching ist sehr mächtig und genial :) –