2014-01-20 55 views
3

我對此進行了廣泛的研究,無法找到適用於此場景的最佳實踐。Java通配符鑄造的最佳實踐

ArrayList<GenericObject<?>> list = new ArrayList<>(); 
list.add(new GenericObject<Integer>(6)); // Autoboxing 
list.add(new GenericObject<String>("HI")); 
if(list.get(0).getGenaricValue().getClass() == Integer.class){ 

     GenericObject<Integer> gi = (GenericObject<Integer>) list.get(0); 
     System.out.println("Was Integer"); 
     System.out.println(gi); 
    } 
} 

while this block of code works from cast GenericObject <? >到GenericObject <Integer>給出未經檢查的警告。現在你可以看到我用if語句清楚地檢查了類型,所以我對異常沒有偏執,但是有沒有更好的方法來做到這一點,而不必禁止未經檢查的警告?這種情況下是否有最佳做法? 我已經閱讀了整個泛型Oracle教程 here,我已經閱讀了很多stackoverflow的帖子,但似乎沒有回答這個問題。任何幫助,將不勝感激謝謝。

+1

非常人爲的例子?無論如何添加通配符實例,通用包裝器的意義何在?順便說一句,該對象包含實際上是一個'Integer'並不意味着它必須是一個'GenericObject ',它也可能是一個'GenericObject '(因此允許一些方法替代「盒裝」'Integer'用'Double') – mihi

+0

解決這大概有'GenericObject 最好的辦法'採取另一種'類'爲參數,並將其存儲,並有一個靜態輔助流延法(抑制unchecked警告),其採用在'GenericObject '和'類'並將它轉換爲'GenericObject '後已經驗證所存儲的'類'值。 – mihi

+0

謝謝@mihi。我看到你關於類被定義爲類型號的觀點,並且有一個類傳遞了一個整數。這是一個很好的觀點,我沒有想到這一點。至於這個例子的重點。假設我有一個所有類型的數據表。我想把它放在表格中,所以我創建了一個名爲Column 的對象;列也有類型T的ArrayList。如果我把所有這些列放在一個ArrayList中,我會有ArrayList >;現在我需要添加一個新行。我將不得不將所有列轉換爲它們的信號類型,以便將值添加到它們的內部數組中 – rickmaster

回答

2

沒有,有沒有比相應的警告更好的辦法,用一個解釋:

@SuppressWarnings("unchecked") // this is okay because [insert reasoning] 
GenericObject<Integer> gi = (GenericObject<Integer>) list.get(0); 

注意,這不一定是一個好的設計但是 - 這是最好避免未經檢查的強制轉換可能的話,如果只因爲它們很難證明是正確的。例如,如果gi早些時候被輸入爲GenericObject<Object>GenericObject<Number>,並恰好持有Integer?這可能會更好地檢查和投射值本身:

GenericObject<?> go = list.get(0); 
Object obj = go.getGenericValue(); 
if (obj instanceof Integer) { // or obj.getClass() == Integer.class 
    System.out.println("Was Integer"); 
} 
+0

是的,我認爲第二個是這種情況下的最佳選擇。 –

+0

感謝您的回答。然而,這裏的最終目標是能夠使用類型化的泛型,例如添加另一個相同類型的值。即gi.setValue2(8);該方法定義爲「public void setGenaricValue2(T genaricValue)」。 – rickmaster

0

我不認爲有辦法做到這一點沒有警告。該類型的參數GenericObject<T>T總是刪除在運行,所以即使你使用的instanceof操作(這將在其他情況下襬脫了警告),你不能使用它在一個通用類,例如,if(o instanceof GenericObject<Integer>)將無法​​編譯。