java - 为什么 Java Collections 的移除方法不是通用的?

标签 java generics collections

<分区>

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

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

然后,当您不小心尝试删除(例如)Set<String>而不是来自 Collection<String> 的每个单独的字符串,这将是一个编译时错误,而不是稍后的调试问题。

最佳答案

remove() (在 Map 以及 Collection 中)不是通用的,因为您应该能够将任何类型的对象传递给 remove() .删除的对象不必与您传递给 remove() 的对象的类型相同。 ;它只要求它们相等。来自 remove() 的规范, remove(o)删除对象 e这样 (o==null ? e==null : o.equals(e))true .请注意,没有什么需要 oe是同一类型。这是因为 equals()方法接受 Object作为参数,而不仅仅是与对象相同的类型。

尽管如此,许多类都有 equals() 可能是普遍事实。定义为它的对象只能等于它自己类的对象,当然情况并非总是如此。例如,List.equals() 的规范表示如果两个 List 对象都是 List 并且具有相同的内容,则它们是相等的,即使它们是 List 的不同实现也是如此。 .所以回到这个问题中的例子,有可能有一个 Map<ArrayList, Something>我调用remove()LinkedList作为参数,它应该删除作为具有相同内容的列表的键。如果remove(),这是不可能的是通用的并且限制了它的参数类型。

关于java - 为什么 Java Collections 的移除方法不是通用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31807651/

相关文章:

java - JSVC 作为守护进程启动 - 启用 JMX?

java - 您可以禁用 JFace 向导中的后退按钮吗?

Java反射/泛型

java - 使用 java 8 流生成一个 N 个字符长的虚拟字符串

java - spirngframework.ws HttpComponentsMessageSender - 如何设置每个主机的最大连接数?

ios - 按索引移动数组中的元素

ios - 具有一个参数/参数的泛型类的泛型类

java - 将列表中的元素添加到字符串数组

c# - 是否可以编写一个递归的 IEnumerable<T>

java - 我们可以有一个字段在 Java 中实现两个或多个接口(interface)吗?