2012-10-25 34 views
3

可能重复:
Why aren’t Java Collections remove methods generic?Java列表界面包含(对象O)方法的签名

Java的Collection<E>接口具有contains方法具有以下签名:

boolean contains(Object o) 

由于接口类型为E不应签名是
boolean contains(E o)

,以反映并只允许E类型的参数。

同样的问题可以关于remove(Object o)方法

+2

可能是它在java世界中诞生之前被添加的世界 –

+0

查看[Collection JavaDoc](http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html# contains(java.lang.Object)),它看起来像Java 1.2中的方法,泛型在Java语言中还不存在。 –

+0

此问题以前已被问及过很多次:[为什么Java Map 对get和remove方法采用非类型化参数?](http://stackoverflow.com/questions/4269147/why-does-java-mapk -v-take-an-untyped-parameter-for-the-the-get-and-remove-methods)和[为什么不是Java集合删除方法通用?](http://stackoverflow.com/questions/104799/why -arent-java-collections-remove-methods-generic) –

回答

3

containsremove方法接受任何对象,因为他们接受(并能与成功),可能不会是E实例的对象询问。该contract for contains是:

返回true当且仅当这个集合包含至少一个元素e(O == NULLé== NULL:o.equals(e)项)

请注意,o实际上不必是集合中的对象;它只能通过equals测试。

对于remove也有同样的想法。

另请参见this thread,其中指出使containsremove通用会打破许多现有的,完全有效的代码。