为什么Collection.remove(Object o)不通用?
Collection.remove(Object o)
好像Collection<E>有boolean remove(E o);
Collection<E>
boolean remove(E o);
然后,当你不小心尝试从中删除(例如)Set<String>而不是每个String时Collection<String>,这将是编译时错误,而不是以后的调试问题。
Set<String>
String
Collection<String>
remove()(Map以及中的Collection)不是通用的,因为你应该能够将任何类型的对象传递给remove()。删除的对象不必与你传递给的对象具有相同的类型remove();它只要求它们相等。从本说明书中remove(),remove(o)将删除对象e,使得(o==null ? e==null : o.equals(e))是true。请注意,没有什么要求,o并且e必须是相同的类型。这是因为该equals()方法接受一个Objectas参数,而不仅仅是与该对象相同的类型。
remove()
Collection
remove(o)
(o==null ? e==null : o.equals(e))
equals()
Objectas
虽然,通常已经equals()定义了许多类,以便其对象只能等于其自己的类的对象,这确实是正确的,但事实并非总是如此。例如,的规范List.equals()说两个List对象都是相同的,并且都是相同的内容,即使它们都是的不同实现,也是如此List。因此,回到这个问题的示例中,有可能让Map<ArrayList, Something>and和我remove()一起使用LinkedListas参数调用它,并且应该删除键,该键是具有相同内容的列表。如果remove()是通用的并且限制了它的参数类型,那将是不可能的。
List.equals()
List
Map<ArrayList, Something>and
LinkedListas