java SonarQube抱怨检查集合中的列表#包含<?扩展整数>
SonarQube抱怨下面的代码
public static Predicate<ClassA> createPredicate(Collection<? extends Integer> list) {
return classA -> list.contains(classA.getId());
}
通过说“A Collection<? extends Integer>
不能包含A int
”
我在这里使用Collection<? extends Integer>
提示一下这个方法,不要在Collection
中添加元素
你说的是实话吗?我应该用Collection<Integer>
来代替
# 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>
更安全