首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SonarQube抱怨在Collection<中检查List#contains?扩展Integer>

SonarQube抱怨在Collection<中检查List#contains?扩展Integer>
EN

Stack Overflow用户
提问于 2018-01-04 21:13:05
回答 1查看 533关注 0票数 1

SonarQube抱怨下面的代码

代码语言:javascript
复制
public static Predicate<ClassA> createPredicate(Collection<? extends Integer> list) {
    return classA -> list.contains(classA.getId());
}

说“Collection<? extends Integer>不能包含int”。

我在这里使用的是一个Collection<? extends Integer>,给出一个关于这个方法的提示,不要向Collection添加元素。

SonarQube在这里说的是真话吗?我应该用Collection<Integer>代替吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-04 21:35:35

我的预感是,SonarQube试图在这里变得过于聪明。

几点意见:

  1. Collection<? extends Integer>可以包含Integer。由于Integer是最后一个类,它实际上可以不包含任何其他类,因此为了您自己的理智,您最好使用一个Collection<Integer> (除非您的实际用例在我无法想象的方式上更加复杂)。
  2. Collection<? extends Integer>不能包含int,因为这是一个基本类型,所以SonarQube在这里确实是正确的,但是由于int将被装箱,这个表达式仍然有意义。
  3. SonarQube解释了装箱的可能性,这就是为什么当您使用Collection<Integer> (当然,它实际上也不能包含int )时,警告会消失的原因。但是,它只考虑了泛型类型是查找类型(来源)的装箱版本的情况,而不是泛型类型是其子类型的情况。(Iirc,所有的装箱原语类型都是最终的,因此规则的作者可能发现为<? extends BoxedPrimitive>制定特殊条款是不相关的。)

如果后者是正确的,那么忽略警告应该是安全的,但首先使用Collection<Integer>更安全。

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

https://stackoverflow.com/questions/48103655

复制
相关文章

相似问题

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