SonarQube抱怨在Collection <! - 中检查List#contains?扩展整数 - >

时间:2018-01-04 21:13:05

标签: java

SonarQube抱怨以下代码

public static Predicate<ClassA> createPredicate(Collection<? extends Integer> list) {
    return classA -> list.contains(classA.getId());
}

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

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

SonarQube是否在这里说实话,我应该使用Collection<Integer>代替?

1 个答案:

答案 0 :(得分:1)

我的预感是SonarQube试图在这里过于聪明一半。

一些观察结果:

  1. Collection<? extends Integer>可以包含Integer个。由于Integer是一个最终类,它实际上可以包含其他内容,所以为了您自己的理智,您可以使用Collection<Integer>(除非您的实际用例更复杂,我不能但想象一下。)

  2. Collection<? extends Integer>不能包含int,因为它是原始类型,因此SonarQube在这里确实是正确的,但由于int将被装箱,因此表达式仍然有效感。

  3. SonarQube解释了拳击的可能性,这就是为什么当你使用Collection<Integer>(当然也不能包含int时警告消失的原因)。但是,它只考虑了泛型类型是查找类型(source)的盒装版本的情况,而不是通用类型是其子类型。 (Iirc,所有盒装原始类型都是最终的,因此该规则的作者可能发现与<? extends BoxedPrimitive>制定特殊条款无关。)

  4. 如果后者属实,忽略警告应该是安全的,但首先使用Collection<Integer>会更安全。