我是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()方法,由于它正在重载,因此将其参数视为索引,而不是对象。这是正确的吗?为什么会发生这种情况,以及如何使用函数绑定来修复列表以打印所需的输出?
谢谢。
答案 0 :(得分:1)
Set.remove(Object)
删除等于Object
参数的元素,而List.remove(int index)
删除索引参数处的元素。
请注意,remove(int index);
是在List
中定义的,而不是在Set
接口中定义的,因为Set
接口的元素没有特定的顺序。
编译器选择与参数的声明类型匹配更多的方法。对于List
,remove(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))