2016-06-01 107 views
4

我想從會話對象中讀取一個值,該值返回Object類型。 我知道該對象具有true/false值。 我想將該值轉換爲boolean類型。所以我有以下代碼。在Java中強制轉換.toString()和(String)的區別

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

下面拋出異常。

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

下面的工作正常。

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

其實,我不明白爲什麼選項1不工作?

+0

在這裏,這可能是劉曉丹的,太:http://stackoverflow.com/ question/328661/explicit-vs-implicit-call-of-tostring – GhostCat

+0

session.getAttribute(「MyKeyValue」)。getClass()是什麼值? – yelliver

回答

8

當由session.getAttribute("MyKeyValue")返回的實例的運行時類型不是String時,將其轉換爲String會拋出ClassCastException

另一方面,session.getAttribute("MyKeyValue").toString()始終有效(假設session.getAttribute("MyKeyValue")不爲空),因爲所有對象都具有toString()方法的實現。

順便說一句,因爲session.getAttribute("MyKeyValue")不返回String,很可能它返回一個Boolean(因爲你期望Boolean.parseBoolean()工作),所以如果這是不是將其轉換爲String,然後Boolean的情況下,你可以將它轉換爲Boolean

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

您可以在會話對象任何你想要的對象和準設置爲它的關鍵。任何對象都意味着任何類的任何對象。由於任何類別都是Object的可能間接子類別,因此setget中的類型爲Object

當您通過get檢索對象時,它只是鍵入爲Object,但肯定是一些子類。 (下)如果原始類不是String,則將其轉換爲String可能會失敗(拋出異常,表示無法實現轉換/轉換)。似乎是爲您的選擇1.

選項2級的作品,因爲任何Object實例有一個方法toString(),可以調用來獲取對象的String表示(它在屏幕上呈現主要是有用的)的情況。然後你parse表示(可能是"true""false")以獲得值爲truefalseboolean

所以,如果你希望你的選項1,工作,你的對象可能是一個Boolean例如,你可以使用:

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

'靜態'方法'Boolean.parseBoolean(String)'返回'boolean'而不是'Boolean'。 http://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#parseBoolean-java.lang.String-這裏沒有拆箱。 –

+0

更正,謝謝。 –

+0

另請注意,如果值爲'null',那麼拆箱會拋出一個NullPointerException異常(當然,正如OP的'toString'版本一樣)。 – Hulk

相關問題