2009-07-15 26 views
24

我喜歡java中的泛型特性並經常使用它。但是我有一個問題,如果我使用那些還沒有意識到泛型的庫。一個例子是servlet。如果使用ServletRequest.getParameterMap(),結果將是原始映射,但它僅包含String作爲鍵,而String[]作爲值。所以我想把它分配給Map<String, String[]>。但是對於這項任務,我得到了一個警告。我怎樣才能避免這種警告與語言,而不是簡單地用@SuppressWarnings註釋壓制警告。如何在Java中使用遺留庫來避免未經檢查的轉換警告?

回答

36

正如其他人所說的警告是無法避免的,除非通過壓制它們。恕我直言,問題在於要麼使用適用於小範圍的註釋來拋棄代碼,要麼在全局忽略它們並冒着錯誤的風險。

IIRC有一個建議,在原始類型被返回而不是在呼叫時產生警告。

同時,我認爲最好的辦法是使用包裝方法,這樣的警告被限制在一個地方,它是安全的忽視,他們說:

class NoWarn { 
    public static Map<String, String[]> getParameterMap(ServletRequest r) 
    { 
    @SuppressWarnings("unchecked") 
    Map<String, String[]> result = r.getParameterMap(); 
    return result; 
    } 
} 

注意 這個答案是用註釋編輯,註釋不能在方法體內。這是不正確的,上面的語法正確。我已經回覆了這個變化。

+0

我希望您提到的提議能夠快速實施(Java7?),因爲那樣可以清楚地解決我的問題。 – Mnementh 2009-07-20 10:41:43

1

我不認爲你可以。警告將出現,除非您禁止它,或者從IDE的警告列表中進行過濾。

2

我怎樣才能避免與 語言此警告,而不是簡單地抑制 與 SuppressWarnings的註釋警告。

註釋避免與語言警告的方式。沒有其他辦法。

8

您可以做的最乾淨的事情是封裝從遺留代碼到泛型代碼的轉換,並僅在那裏禁止警告。

E.g.你可以在你的遺留庫上放置一個通用的外觀,儘管這可能並不總是值得的。

+1

+1在舊API上編寫一個樣板化的封裝包裝,並在其上打擊警告。 – skaffman 2009-07-15 10:35:28

1

我有同樣的問題,我只是關閉所有通用警告,我很高興:)你也可以關閉serialVersionUID警告,因爲很多人不使用serialVersionUID。在Eclipse - Window/Perferences/Java/Compiler/Errors/Warnings中使用

並關閉所有通用類型。

P.S.許多錯誤的警告讓你忽略所有的警告,有些警告可能是有用的。

+1

我使用警告作爲改進的可能性。我沒有收到很多警告,因爲我在路上解決了所有問題。通常,未經檢查的轉換警告對找到可以改進的代碼部分非常有幫助。但在這種情況下,我不認爲沒有壓制這個警告。 – Mnementh 2009-07-15 12:03:39

0

正如其他人所說,擺脫這種警告的唯一方法就是壓制它。

最好的做法是使用方法和類來封裝警告。

但與其他警告,總是試圖解決正在使他們的問題,如刪除未使用的進口等...它使您的應用程序更加精簡和更好。

編碼快樂

0

偶然發現了這個問題,因爲我也試圖找出一種方法來避免使用禁止標註在這種情況下。我發現另一個我認爲值得一提的選擇:

Map<?, ?> map = servletRequest.getParameterMap(); 
    String[] values = (String[]) map.get("key"); 

我們基本上使用通配符'?'以表明地圖可以具有任何類型的鍵和值。

我在這裏看到的潛在缺點是我們在獲取值時進行顯式強制轉換,我認爲這會在運行時導致輕微的性能開銷。

相關問題