为什么我们有包含(对象o)而不是包含(E e)?
是为了保持与旧的(非通用化)版本的向后兼容性吗?还是我错过了更微妙的细节?我看到这种模式也在()中重复,但被泛型为。Collection
remove
remove(Object o)
add
add(E e)
是为了保持与旧的(非通用化)版本的向后兼容性吗?还是我错过了更微妙的细节?我看到这种模式也在()中重复,但被泛型为。Collection
remove
remove(Object o)
add
add(E e)
contains()
采用 ,因为它匹配的对象不必与您传入的对象的类型相同;它只要求他们是平等的。根据 的规范,如果存在这样的对象为 true,则返回 true。请注意,没有任何要求并且是相同的类型。这是因为该方法采用 as 参数,而不仅仅是与对象相同的类型。Object
contains()
contains()
contains(o)
e
(o==null ? e==null : o.equals(e))
o
e
equals()
Object
尽管许多类通常都定义了它的对象只能等于它自己类的对象,但情况并非总是如此。例如,的规范说,如果两个对象都是 s 并且具有相同的内容,即使它们是 List 的不同实现,则两个对象相等。因此,回到这个问题中的示例,可以有一个和我用 as 参数调用,如果存在具有相同内容的列表,则可能会返回 true。如果是泛型的,并且将其参数类型限制为 ,则不可能做到这一点。equals()
List.equals()
List
List
Collection<ArrayList>
contains()
LinkedList
contains()
E
事实上,将任何对象作为参数的事实允许一个有趣的用法,您可以使用它来测试集合中满足某个属性的对象是否存在:contains()
Collection<Integer> integers;
boolean oddNumberExists = integers.contains(new Object() {
public boolean equals(Object e) {
Integer i = (Integer)e;
if (i % 2 != 0) return true;
else return false;
}
});
在这里回答。
为什么 Java 集合删除方法不是泛型的?
简而言之,他们希望最大限度地提高向后兼容性,因为集合早在泛型之前就已经引入。
我还要补充一点:他所指的视频值得一看。
http://www.youtube.com/watch?v=wDN_EYUvUq0
更新
为了澄清,说(在视频中)的人是更新java映射和集合以使用泛型的人之一。如果他不知道,那么是谁。