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>
代替?
答案 0 :(得分:1)
我的预感是SonarQube试图在这里过于聪明一半。
一些观察结果:
Collection<? extends Integer>
可以包含Integer
个。由于Integer
是一个最终类,它实际上可以包含其他内容,所以为了您自己的理智,您可以使用Collection<Integer>
(除非您的实际用例更复杂,我不能但想象一下。)
Collection<? extends Integer>
不能包含int
,因为它是原始类型,因此SonarQube在这里确实是正确的,但由于int
将被装箱,因此表达式仍然有效感。
SonarQube解释了拳击的可能性,这就是为什么当你使用Collection<Integer>
(当然也不能包含int
时警告消失的原因)。但是,它只考虑了泛型类型是查找类型(source)的盒装版本的情况,而不是通用类型是其子类型。 (Iirc,所有盒装原始类型都是最终的,因此该规则的作者可能发现与<? extends BoxedPrimitive>
制定特殊条款无关。)
如果后者属实,忽略警告应该是安全的,但首先使用Collection<Integer>
会更安全。