gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:40:07 27 4
gpt4 key购买 nike

是否要保持与 Collection 的旧(非泛化)版本的向后兼容性?还是我遗漏了更微妙的细节?我在 remove 中也看到了这种模式 (remove(Object o)),但是 add 被泛化为 add(E e)

最佳答案

contains()需要 Object因为它匹配的对象不必与您传递给 contains() 的对象是同一类型;它只要求它们相等。来自 contains() 的规范, contains(o)如果存在对象则返回 true e这样 (o==null ? e==null : o.equals(e))是真的。请注意,没有什么需要 oe是同一类型。这是因为 equals()方法接受 Object作为参数,而不仅仅是与对象相同的类型。

尽管很多类都有 equals() 可能是普遍事实定义为它的对象只能等于它自己类的对象,当然情况并非总是如此。例如,List.equals() 的规范说两个 List如果两个对象都是 List,则对象相等s 并且具有相同的内容,即使它们是 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;
}
});

关于java - 为什么我们有 contains(Object o) 而不是 contains(E e)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2994123/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com