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

Viv*_*ath 17 java generics collections contains

它是否与旧的(非泛化)版本保持向后兼容Collection?还是有一个我错过的更细微的细节?我看到这个模式在removealso(remove(Object o))中重复,但是add被泛化为add(E e).

new*_*cct 11

contains()取一个Object因为它匹配的对象不一定是你传入的对象的类型contains(); 它只要求它们是平等的.从规范中contains(),contains(o)如果有一个e如此的对象,(o==null ? e==null : o.equals(e))则返回true.请注意,没有任何要求oe相同的类型.这是因为该equals()方法接受Objectas参数,而不仅仅是与对象相同的类型.

尽管通常equals()可以确定许多类已经定义,以便其对象只能等于其自己的类的对象,但情况肯定并非总是如此.例如,如果List.equals()两个List对象都是Lists并且具有相同的内容,则表示两个对象相等的规范,即使它们是List的不同实现.所以回来的例子在这个问题上,可以有一个Collection<ArrayList>和我打电话给contains()一个LinkedList作为参数,如果存在具有相同内容的列表,它会返回true.如果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;
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 此方法签名`contains(Object o)`提供了一个非常好的枪,可以方便地用脚射击自己.这种方法实际上是Java Generics限制的一个展示. (5认同)

Nik*_*bak 5

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

从我这里补充一下:他所指的视频值得关注.
http://www.youtube.com/watch?v=wDN_EYUvUq0

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