2010-05-28 142 views
8
Map session = ActionContext.getContext().getSession(); 
session.put("user", user); 

此代碼生成警告:類型安全性:方法put(Object,Object)屬於原始類型Map。參考通用類型地圖< K,V>應參數化如何解決這個Java類型的安全警告?

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

此代碼生成一個警告:類型安全:未選中從地圖轉換爲地圖<字符串,序列化>

getSession方法屬於Struts2,所以我不能修改它。我想避免使用@SuppressWarnings,因爲其他警告可能會有用。

我想世界上所有的Struts2用戶都面臨同樣的問題......有沒有一個優雅的解決方案?

回答

8

我不認爲有任何其他的方式,但@SuppressWarnings(「未登記」)。我相信你可以把它放在問題的上方,它只會壓制這條線。

編輯:你也可以做Map<?, ?> session = ActionContext.getContext().getSession();但我不確定你是多麼願意這麼做;您將無法以任何方式將任何內容放入映射中(因爲編譯器無法檢查您所放置的類型),因此只能從中讀取。

0

如果你不喜歡這樣寫道:

Map<String, Serializable> session = ActionContext.getContext().getSession(); 
+0

它給了一個警告:類型安全:Map類型的表達式需要選中轉換,以符合地圖<字符串,可串行化> – 2010-05-28 08:14:21

1

您使用的是什麼版本的Struts 2(特別是XWork)?對我來說,你的下面的代碼給出了一個錯誤:

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

Cannot cast from Map<String,Object> to Map<String,Serializable>. 

此,在另一方面,作品並給出任何警告:

Map<String, Object> session = ActionContext.getContext().getSession(); 
+0

不是嗎?我收到一個警告(或者是一個錯誤?),如果我沒有投... – helios 2010-05-28 08:17:23

+0

我使用2.1.8.1這是最新版本。您的建議會給出此警告:類型安全性:類型映射的表達式需要進行未經檢查的轉換以符合映射 2010-05-28 08:17:24

+1

http://struts.apache.org/2.1.8.1/struts2-core/apidocs/com/opensymphony /xwork2/ActionContext.html看起來2.1.8.1 getSession應該返回一個參數化映射。你確定它已正確安裝並且沒有使用先前安裝的舊版本嗎? – 2010-05-28 08:23:50

3

最安全,最有效的方式來處理這大概是:

Map<?, ?> session = ActionContext.getContext().getSession(); 

然後鍵入轉換從會話映射中檢索到的對象。

@SuppressWarnings方法實際上會導致相同的編譯代碼。然而,類型轉換將是隱含的;即通過查看源代碼將不容易發現。 @SuppressWarnings註釋可以(假設)在代表真實錯誤的相同代碼塊中抑制一些其他警告;即會導致隱藏的類型轉換之一等在運行時失敗。

其他更便宜的替代品包括:

  • 通過進入副本的入口從Map<?, ?>到一個新的Map<String, Serializable>實例分別鑄造的鍵值,以StringSerializable,或

  • 泛型方法就像以下那樣安全地執行類型轉換。


@SuppressWarnings("unchecked") 
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) { 
    for (Map.Entry<?, ?> entry : map.entrySet()) { 
     kClass.cast(entry.getKey()); 
     vClass.cast(entry.getValue()); 
    } 
    return (Map<K,V>) map; 
} 
0

它要求你參數的值,如果這個值需要的參數,然後將它們傳遞。

例如

Map<Integer, Map> vCombinedCodeMap = new HashMap<>(); 

將給予 「參數」 Map<Integer, Map>警告。

所以正確的格式如下:

Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>(); 
0

演員,如下圖所示

public void setSession(Map<String, Object> sessionMap) { 

    // TODO Auto-generated method stub 

    this.sessionMap = (SessionMap<String, Object>) sessionMap; 
}