Java set.remove vs list.remove(函数绑定)

Java set.remove vs list.remove(函数绑定),java,list,set,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方法,因为它正在重载,所以它

我是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方法,因为它正在重载,所以它将其参数视为索引,而不是对象。是这样吗?为什么会发生这种情况?如何使用函数绑定修复列表以打印所需的输出

提前感谢。

Set.removeObject删除与Object参数相等的元素,而List.removeint index删除index参数处的元素

注意移除索引;在列表中定义,但不在集合接口中定义,因为集合接口没有元素的特定顺序

编译器选择与参数声明类型匹配的方法。对于列表,删除索引;哪一个与int匹配得更多。 关于Set.remove调用,编译器将方法限制为Set.removeObject,因为这是唯一的可能性,而且装箱功能允许在编译时将int转换为整数

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

list.remove((Integer) i) 
因为在本例中,对于编译器,这两个方法都是合格的,但它选择removeObject obj;因为它比删除索引更具体;对于已传递的整数声明类型参数。

这是因为列表提供了两种风格的remove

1移除对象

2 removeindex

当int被传递到remove时,调用第二个int

解决方案


list.removenew Integeri

@Aomine。的确这可能就是他/她想要的。我因此更新了。谢谢