首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >set.remove与list.remove (函数绑定)

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

Stack Overflow用户
提问于 2018-12-15 16:58:40
回答 2查看 639关注 0票数 0

我对java很陌生。这看起来很简单,但我不明白为什么会这样。

代码语言:javascript
复制
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()方法,由于它是重载的,所以它认为它的参数是索引,而不是对象。是这样的吗?为什么会发生这种情况,以及如何使用函数绑定修复列表以打印所需的输出?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-15 17:03:12

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所说的,你要找的是:

代码语言:javascript
复制
list.remove((Integer) i) 

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

票数 1
EN

Stack Overflow用户

发布于 2018-12-15 17:12:51

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

1) remove(Object)

2) remove(index)

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

解决办法;

list.remove(new Integer(i))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53795293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档