【问题标题】:set.remove vs list.remove (function binding) [duplicate]set.remove vs list.remove(函数绑定)[重复]
【发布时间】:2018-12-15 16:58:40
【问题描述】:

我是 Java 新手。看起来很简单,但我不明白为什么会这样。

for (int i = -3; i < 3; i++){
    set.add(i);
    list.add(i);
}
for (int i = 0; i < 3; i++){
    set.remove(i);
    list.remove(i);
}

当他们打印自己时,set 打印 [-3, -2, -1](期望的输出),而 list 打印 [-2, 0, 2](不需要的输出)。 对于 list.remove() 方法,因为它是重载的,所以它认为它的参数是索引,而不是对象。这是正确的吗?为什么会发生这种情况?如何修复列表以使用函数绑定打印所需的输出?

提前致谢。

【问题讨论】:

    标签: java list set


    【解决方案1】:

    Set.remove(Object) 删除等于Object 参数的元素,而List.remove(int index) 删除索引参数处的元素。

    请注意,remove(int index); 是在 List 中定义的,但不是在 Set 接口中定义的,因为 Set 接口没有特定的元素顺序。

    编译器选择与声明的参数类型匹配的方法。对于Listremove(int index);int 的匹配度更高。
    关于Set.remove() 调用,编译器将方法绑定到Set.remove(Object),因为这是唯一的可能性,并且装箱功能允许在编译时将int 转换为Integer

    正如青峰所说,您正在寻找的是:

    list.remove((Integer) i) 
    

    因为在这种情况下,对于编译器来说,这两种方法都符合条件,但它选择了 remove(Object obj);,因为它比 remove(int index); 更具体,因为传递了 Integer 声明的类型参数。

    【讨论】:

    • @Aomine。的确。这可能就是他/她所寻找的。我因此更新。谢谢
    【解决方案2】:

    这是因为List 提供了两种风格的remove()

    1) remove(Object)

    2)remove(index)

    int 被传递给remove 时,第二个被调用。

    解决方案;

    list.remove(new Integer(i))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 2014-10-20
      • 2013-01-03
      • 2011-03-24
      • 2020-10-28
      • 2019-05-25
      • 2013-09-18
      • 1970-01-01
      相关资源
      最近更新 更多