为什么我们有包含(对象o)而不是包含(E e)?

2022-09-02 13:23:09

是为了保持与旧的(非通用化)版本的向后兼容性吗?还是我错过了更微妙的细节?我看到这种模式也在()中重复,但被泛型为。Collectionremoveremove(Object o)addadd(E e)


答案 1

contains()采用 ,因为它匹配的对象不必与您传入的对象的类型相同;它只要求他们是平等的。根据 的规范,如果存在这样的对象为 true,则返回 true。请注意,没有任何要求并且是相同的类型。这是因为该方法采用 as 参数,而不仅仅是与对象相同的类型。Objectcontains()contains()contains(o)e(o==null ? e==null : o.equals(e))oeequals()Object

尽管许多类通常都定义了它的对象只能等于它自己类的对象,但情况并非总是如此。例如,的规范说,如果两个对象都是 s 并且具有相同的内容,即使它们是 List 的不同实现,则两个对象相等。因此,回到这个问题中的示例,可以有一个和我用 as 参数调用,如果存在具有相同内容的列表,则可能会返回 true。如果是泛型的,并且将其参数类型限制为 ,则不可能做到这一点。equals()List.equals()ListListCollection<ArrayList>contains()LinkedListcontains()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;
    }
});

答案 2

在这里回答。
为什么 Java 集合删除方法不是泛型的?
简而言之,他们希望最大限度地提高向后兼容性,因为集合早在泛型之前就已经引入。

我还要补充一点:他所指的视频值得一看。
http://www.youtube.com/watch?v=wDN_EYUvUq0

更新
为了澄清,说(在视频中)的人是更新java映射和集合以使用泛型的人之一。如果他不知道,那么是谁。