set.remove与list.remove(函数绑定)

时间:2018-12-15 16:58:40

标签: java list set

我是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);
}

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

谢谢。

2 个答案:

答案 0 :(得分: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

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

list.remove((Integer) i) 

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

答案 1 :(得分:0)

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

1)remove(Object)

2)remove(index)

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

解决方案;

list.remove(new Integer(i))