一尘不染

为什么Java Collections不能通用删除方法?

java

为什么Collection.remove(Object o)不通用?

好像Collection<E>boolean remove(E o);

然后,当你不小心尝试从中删除(例如)Set<String>而不是每个StringCollection<String>,这将是编译时错误,而不是以后的调试问题。


阅读 375

收藏
2020-02-29

共1个答案

一尘不染

remove()(Map以及中的Collection)不是通用的,因为你应该能够将任何类型的对象传递给remove()。删除的对象不必与你传递给的对象具有相同的类型remove();它只要求它们相等。从本说明书中remove()remove(o)将删除对象e,使得(o==null ? e==null : o.equals(e))是true。请注意,没有什么要求,o并且e必须是相同的类型。这是因为该equals()方法接受一个Objectas参数,而不仅仅是与该对象相同的类型。

虽然,通常已经equals()定义了许多类,以便其对象只能等于其自己的类的对象,这确实是正确的,但事实并非总是如此。例如,的规范List.equals()说两个List对象都是相同的,并且都是相同的内容,即使它们都是的不同实现,也是如此List。因此,回到这个问题的示例中,有可能让Map<ArrayList, Something>and和我remove()一起使用LinkedListas参数调用它,并且应该删除键,该键是具有相同内容的列表。如果remove()是通用的并且限制了它的参数类型,那将是不可能的。

2020-02-29