2009-11-25 67 views
0

可能重複:
What are the reasons why Map.get(Object key) is not (fully) generic爲什麼幾個java.util.List方法不使用type參數?

這是類似的問題here,對java.util.Map。這個問題留給了這個問題。


List接口包含幾個方法仍然接受一個對象作爲參數,泛型在Java 5中引入如後:

boolean contains(Object o) 
int lastIndexOf(Object o) 
boolean remove(Object o) 

我期待這些方法使用的類型參數。事情是這樣的:

boolean contains(E e) // Where the interface is defined as List<E> 

雖然,它必須是<? extends E>,但我不知道語法是的。

是否有設計原因,爲什麼這些方法需要一個對象,或者它是爲了向後的字節碼兼容性,還是另一個原因?

+1

這是一個欺騙 - 只是試圖找到正確的問題... –

+1

但凱文乙在這裏有答案之前,我發現我的參考:) http://smallwig.blogspot.com/2007/12/why-does-setcontains-take-object -not-e.html –

+1

明白了:http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic(談論地圖而不是比列表,但它是相同的交易)。 –

回答

1

類型參數只有真正用於確保任何爲添加到列表或從列表中檢索的類型是正確的。它不關心你是否給它一個另一種類型的對象在集合中查找,因爲無論如何它只會使用Object.equals()。它根本不會找到它,這是預期的行爲。

編輯:凱文B的博客文章,在評論中引用,是一個更好的解釋。

+0

「它根本找不到它」不,不同類型的對象可能是相同的。這就是您能夠提供任何類型對象的真正原因。 – newacct

1

我相信這是所以你仍然可以允許不同類型的集合中的對象是不一定給定類型的子類E.

0

泛型的目的是確保您始終知道您正在處理的是哪種類型。這些方法不是「危險的」,它們不會損害集合的類型,所以當移動是在Java 5中進行時,不需要添加仿製藥。

相關問題