为什么有几个java.util.List方法不使用type参数?

时间:2009-11-25 17:20:05

标签: java generics collections

  

可能重复:
  What are the reasons why Map.get(Object key) is not (fully) generic

这与java.util.Map上的问题here类似。这个问题留作了指向该问题的指针。


在Java 5中引入泛型之后,List接口包含几个仍然接受Object作为参数的方法。例如:

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

我希望这些方法能够使用type参数。像这样:

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

虽然,它必须是<? extends E>,但我不确定它的语法。

是否存在设计原因,为什么这些方法采用Object,或者它是为了向后字节码兼容性,还是另一个原因?

3 个答案:

答案 0 :(得分:1)

我相信它仍然允许集合中不同类型的对象不一定是给定类型E的所有子类。

答案 1 :(得分:1)

类型参数仅用于确保添加到列表或从列表中检索的任何内容都具有正确的类型。它并不关心你是否在集合中为它寻找另一种类型的对象,因为它无论如何都只会使用Object.equals()。它根本找不到它,这是预期的行为。

编辑:Kevin B关于它的博客文章,在评论中引用,是一个更好的解释。

答案 2 :(得分:0)

仿制药的目的是确保您始终知道您正在处理的类型。这些方法并不“危险”,它们不会损害集合的类型,因此在Java 5中进行移动时不需要为它们添加泛型。