我对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,而list打印-2, 0, 2。对于list.remove()方法,由于它是重载的,所以它认为它的参数是索引,而不是对象。是这样的吗?为什么会发生这种情况,以及如何使用函数绑定修复列表以打印所需的输出?
提前谢谢。
发布于 2018-12-15 17:03:12
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);,因为对于传递的Integer声明类型参数,它比remove(int index);更具体。
发布于 2018-12-15 17:12:51
这是因为List提供了两种口味的remove()
1) remove(Object)
2) remove(index)
当int被传递给remove时,第二个被调用。
解决办法;
list.remove(new Integer(i))
https://stackoverflow.com/questions/53795293
复制相似问题