2014-01-16 91 views
0

我有下面的代碼:JAVA鑄造與Maven編譯

public String foobar(Object foo, Map<String,Object> parametersMap){ 
     ... 
     boolean isFoo = (boolean) parametersMap.get("is_foo"); 
     ... 
    } 

我希望它拋出一個類轉換異常(Map.get返回一個對象類型),但事實並非如此。 我正在使用java(7),spring suit和maven(所有項目都有語言級別7)。 該項目編譯並運行良好。

只有一個地方調用這個方法,並且這個參數總是被設置(type primitive boolean)。 編譯器是否有可能以某種方式分析流並識別它(因爲沒有拋出類拋出異常)?

最佳

回答

2

這是Java autoboxing工作

你把原始boolean到您Map,它被轉換成Boolean。一旦你把它拿出來,你可以使用它的原始形式或對象形式而不用投射(或者如果你願意的話可以投射)。

代碼Thse兩段是等價的:

myMap.put("is_foo", true); 

myMap.put("is_foo", Boolean.TRUE); 
+0

你確定沒有轉換的最後一條語句對'Map parametersMap'有效嗎? – Puce

+0

@Puce - 坦率地說,不,我是這麼認爲的。將盡快嘗試。它不適合你,我認爲? – kostja

+0

我沒有嘗試過,但是將一個對象分配給布爾值而沒有進行強制轉換...一個對象的布爾值,好的,反之亦然,你需要一個強制轉換。 – Puce

2

一個ClassCastException只會發生在運行時(而不是在編譯時),並且僅在實際情況下,你是試圖施放不能施放到這種類型。因此,例如:

parametersMap.put("is_foo", true); 
parametersMap.put("is_bar", 5); 
boolean isFoo = (boolean) parametersMap.get("is_foo"); // This would work fine. 
boolean isBar = (boolean) parametersMap.get("is_bar"); // This would throw an exception. 

所有這些都會編譯正常;你只會在運行時遇到問題。

添加到kostja的關於Java自動裝箱的答案,當你這樣做:

boolean isFoo = (boolean) parametersMap.get("is_foo"); 

你得到了地圖的值是一個Boolean對象,和Java自動unboxes爲布爾原始。