2011-03-14 60 views
32

這是我寫的代碼?如何解決Java中未經檢查的調用警告?

Set keys = map.keySet(); 
SortedSet s = new TreeSet(keys); 

我得到的警告是:

warning: [unchecked] unchecked call to TreeSet(java.util.Collection<? extends E>) as a 
     member of the raw type java.util.TreeSet 

如何擺脫編譯器警告的?

+2

我們需要看到更多的代碼(查看上下文)。我懷疑這是因爲你沒有使用泛型,也沒有使用泛型,但是如果你沒有發佈導致警告的代碼,我們可以做的不過是猜測而已。 – 2011-03-14 07:01:46

回答

43

理想情況下,完全使用泛型。您還沒有表現出的map類型是什麼,但最好你應該能夠寫類似:

Set<String> keys = map.keySet(); 
SortedSet<String> s = new TreeSet<String>(keys); 

這將是的情況下map是像一個Map<String, Integer>

如果map本身是一個原始類型,那就更難了 - 最好的解決方法是開始在整個代碼庫中添加泛型,擺脫原始類型。當然,如果地圖是從第三方代碼返回的,那並不總是可能的。在這種情況下,當您從原始類型轉換爲泛型類型時(可能通過Collections.checkedCollection),您可能需要在一行中禁止一條行的警告,但在此之後,您應該能夠正確使用泛型類型。例如:

@SuppressWarnings("unchecked") // Just for this one statement 
Collection<String> keys = Collections.checkedCollection(map.keySet(), 
                 String.class); 

// Now this statement is fully generic with no warnings 
SortedSet<String> s = new TreeSet<String>(keys); 
23

就這個問題而言,你應該使用參數化類型的鍵e.g

Set<TypeOfKeyObject> keys = map.keySet(); 
SortedSet<TypeOfKeyObject> s = new TreeSet<TypeOfKeyObject>(keys); 

其中TypeOfKeyObject在你map對象主要的對象類型。

您可能強制禁止警告(如已經正確建議)但不可取。

冒着聽起來居高臨下的風險,我建議你去研究仿製藥。一個好的起點是:http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+10

「使用參數化鍵類型」是正確的答案,並且已足夠。告訴OP「你需要學習泛型」是居高臨下的。如果我們學習了,我們不需要這樣做,現在我們可以嗎?儘管如此我仍然贊成。 :-P – 2014-11-23 03:27:04

+11

你既不給他魚也不教他釣魚;你告訴他從圖書館看看一本關於釣魚的書。 – Paul 2015-01-14 20:02:23

+3

我在第二段給了他魚。鑑於我們的溝通媒介,這本關於釣魚的書籍是一種告訴他如何釣魚的方法。 :) 別緊張。 – Nishant 2015-01-15 12:44:27