当前位置: 首页 > 面试题库 >

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

越英韶
2023-03-14
问题内容

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

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

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


问题答案:

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()是通用的并且限制了它的参数类型,那将是不可能的。



 类似资料:
  • 问题内容: 我拼命地试图从字符串中删除空格(后来我希望能够将其转换为一个int),但是我似乎无法正常运行。 你能告诉我,我做错了什么吗?PS:我也尝试过\ W“和\ S” 问题答案: 更换 与 它将起作用,因为字符串是不可变的,因此不会更改您的字符串对象,它将返回一个新的字符串对象。因此,您将变量分配给由返回的字符串 另外,您应该尝试遵循Java命名约定,并使字段和变量以小写字母开头。 而且,您也

  • 我了解在lambda中捕获此(修改对象属性)的正确方法如下: 但我对我所看到的以下特点感到好奇: 我感到困惑(并希望得到回答)的奇怪之处在于,为什么以下方法有效: 以及为什么我无法通过引用明确捕获此内容:

  • 我正在编写C++来解决这个问题,从leetcode:https://leetcode.com/problems/remove-element/ 给定数组nums和值val,移除该值的所有实例并返回新的长度。 不要为另一个数组分配额外的空间,您必须用O(1)个额外内存修改输入数组。 元素的顺序可以更改。你在新长度之外留下什么并不重要。 您的函数应该返回长度=2,nums的前两个元素为2。 在返回长度

  • 我在计算一个简单蒸汽的最大值,结果是: (S11000,S1,值:999) (S12000,S1,值:41) 最后一行数据明显迟到了: 为什么按第一个窗口(0-1000)计算? 我认为第一个窗口应该在到达时触发。 对于这个结果,我很疑惑。 MyReductingMax(),MyWindowFunction()

  • 问题内容: 在静态上下文中,为什么不能调用的静态版本(而不是必须使用)? 编译器不够聪明,无法确定何时使用对象方法+何时使用静态方法吗? 注意: 我并不是说应该使用a 而不 是非静态方法(这很明显- 如果是的子类,则a的of 可能返回或其他,必须在运行时确定)。 我是说我想知道为什么没有 两个 版本,一个是仅适用于静态上下文的静态方法,另一个是常规的非静态方法。如果不可能,那就不可能了,那就是答案

  • 问题内容: 我正在构建一个脚本,该脚本必须修补XML文件,包括用一个元素列表替换另一个元素列表。以下函数将补丁(涉及到具有相同名称的元素的可能为空的列表)应用于父元素具有相同名称的元素的列表(也可能为空的列表)。(这只是修补逻辑的一小部分)。 为什么在运行代码时出现以下错误? (下面标记了514行。)据我了解,我刚刚验证了该元素存在(因为NodeList是活动的,因此它的第一个条目将始终是下一个匹