2012-07-30 4 views
21

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]

Antwort

34

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 
}) 
+1

Vergiss das bisschen über Casting; Mustervergleich ist eindeutig der Weg zu gehen –

+0

Ich stimme zu. Pattern-Matching ist sehr mächtig und genial :) –

12

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.

3

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.

+3

Oder Sie verwenden (schlecht gestaltete) Java-Bibliotheken ... – ziggystar

+2

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

+0

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