有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 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>制定特殊规定是无关紧要的。)

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