2016-06-01 26 views
4

Ich möchte einen Wert aus dem Session-Objekt lesen, die Object Typ zurückgibt. Ich weiß, dass das Objekt entweder true/false Wert hat. Ich möchte diesen Wert in boolean Typ konvertieren. Also habe ich den folgenden Code.Was ist der Unterschied zwischen .toString() und (String) in Java umgewandelt

session.getAttribute("MyKeyValue"); // It returns Object type 

Darunter löst eine Ausnahme aus.

boolean myBoolVal = Boolean.parseBoolean((String) session.getAttribute("MyKeyValue")); 

Unten funktioniert einwandfrei.

boolean myBoolVal = Boolean.parseBoolean(session.getAttribute("MyKeyValue").toString()); 

Eigentlich verstehe ich nicht, warum Option 1 nicht funktioniert?

+0

Das hier könnte von interst sein, auch: http://stackoverflow.com/ questions/328661/explicit-vs-impliziter-Aufruf-von-Tostring – GhostCat

+0

Was ist der Wert von session.getAttribute ("MyKeyValue"). getClass()? – yelliver

Antwort

8

Wenn der Laufzeittyp der Instanz durch session.getAttribute("MyKeyValue") zurückgekehrt ist kein String, um es zu String Gießen wirft ein ClassCastException.

Auf der anderen Seite funktioniert session.getAttribute("MyKeyValue").toString() immer funktioniert (unter der Annahme, session.getAttribute("MyKeyValue") ist nicht null), da alle Objekte eine Implementierung der toString()-Methode haben.

BTW, da session.getAttribute("MyKeyValue") nicht zurück ein String, es wahrscheinlich ist, dass es ein Boolean gibt (da Sie erwarten Boolean.parseBoolean() zu arbeiten), so dass, wenn das der Fall ist, anstatt es zu String und dann zu Boolean Umwandlung, Sie können es einfach zu gieße Boolean:

Boolean myBoolVal = (Boolean) session.getAttribute("MyKeyValue"); 
0

Sie in der Session-Objekt einen Schlüssel jedes Objekt, das Sie wollen und Associate ihm einstellen. Jedes Objekt bedeutet ein beliebiges Objekt einer Klasse. Da jede Klasse eine möglicherweise indirekte Unterklasse von Object ist, ist der Typ Object in set und get.

Wenn Sie ein Objekt über get abrufen, wird es einfach als Object eingegeben, ist aber sicherlich von einer Unterklasse. (Down) Casting es auf String möglicherweise fehlschlägt (eine Ausnahme wird mit der Aussage, dass die Besetzung/Konvertierung kann nicht realisiert werden), wenn die ursprüngliche Klasse ist nicht String. Scheint der Fall für Ihre Wahl 1.

Option 2 Werke zu sein, weil jede Object Instanz ein Verfahren hat toString(), die eine String Darstellung des Objekts zu bekommen (vor allem nützlich für die Onscreen-Darstellung davon) aufgerufen werden kann. Dann erhalten Sie parse diese Darstellung (wahrscheinlich "true" oder "false"), um eine boolean von Wert true oder false zu erhalten.

Also, wenn Sie Ihre Wahl wünschen 1 zu arbeiten, wie Ihr Objekt wahrscheinlich eine Boolean Instanz ist, können Sie verwenden:

boolean myBoolVal = (Boolean)session.getAttribute("MyKeyValue"); 
+0

Die 'static' Methode' Boolean.parseBoolean (String) 'gibt ein' boolean' zurück, kein 'Boolean'. http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#parseBoolean-java.lang.String- Hier gibt es kein Unboxing. –

+0

Korrigiert, danke. –

+0

Beachten Sie auch, dass das Unboxing eine NullPointerException auslösen würde, wenn der Wert 'null' ist (wie natürlich auch die 'toString'-Version von OPs). – Hulk