2012-04-27 82 views
0

我們來看看Set<E>的一些方法聲明。編譯時檢查通用類型

public boolean add(E e); 
public E get(int index); 

然後我們試着使用它。即使在這個代碼的非泛型等價物中(正如我所知,它會簡單地轉換成它),我們在兩行中都會遇到編譯錯誤。

List s = new ArrayList(); 
s.contains((Boolean)(new Integer(3))); 
Integer i = (Boolean)s.get(3); 

那麼,爲什麼我不能在通用情況下得到錯誤?

回答

3

查看this question的回答。

基本,remove()等方法只關心被比較的對象靠併除去是等於,而不是它們具有相同的類型。

1

那麼,這條線:

s.contains((Boolean)(new Integer(3))); 

有編譯時錯誤,只是因爲你可以不投什麼顯然是一個Integer實例來布爾。它與List的泛型沒有任何關係。

然後,contains(Object o)不是泛型類型(在java.util.Collection中),這就是爲什麼你沒有得到編譯時警告。這與協方差和反方差有關。

1

從List接口API:

E get(int index) 

所以它返回泛型類型的對象。雖然contains得到Object作爲PARAM:

boolean contains(Object o) 

所以它是所有關於簽名方法。 查看更多關於List