SonarQube抱怨下面的代码
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>代替吗?
发布于 2018-01-04 21:35:35
我的预感是,SonarQube试图在这里变得过于聪明。
几点意见:
Collection<? extends Integer>可以包含Integer。由于Integer是最后一个类,它实际上可以不包含任何其他类,因此为了您自己的理智,您最好使用一个Collection<Integer> (除非您的实际用例在我无法想象的方式上更加复杂)。Collection<? extends Integer>不能包含int,因为这是一个基本类型,所以SonarQube在这里确实是正确的,但是由于int将被装箱,这个表达式仍然有意义。Collection<Integer> (当然,它实际上也不能包含int )时,警告会消失的原因。但是,它只考虑了泛型类型是查找类型(来源)的装箱版本的情况,而不是泛型类型是其子类型的情况。(Iirc,所有的装箱原语类型都是最终的,因此规则的作者可能发现为<? extends BoxedPrimitive>制定特殊条款是不相关的。)如果后者是正确的,那么忽略警告应该是安全的,但首先使用Collection<Integer>更安全。
https://stackoverflow.com/questions/48103655
复制相似问题