使用
List<? super Integer>,应该允许我添加Integer类型或其超类型的任何对象,例如Number或Object。
不对
List<? super Integer>并不意味着 可以容纳Integer的任何超类型的列表 。这意味着 其泛型可能是
Integer的某些 特定
超类型的列表。因此,它实际上可能是
List<Object>,
List<Number>或
List<Integer>。所有这些列表类型都可以包含一个
Integer,但不能说相同
Number。一个
Number可能是一个
Double或一
Long,这是不是在允许的
List<Integer>。
为了更具体一点,请考虑以下代码段:
Long longValue = 2L;List<Integer> listOfIntegers = new ArrayList<>();// listOfIntegers.add(longValue);
带注释的行显然不应该编译,也不应该编译。但是,如果我们添加以下内容呢?
Number longAsNumber = longValue;List<? super Integer> listOfSuper = listOfIntegers;listOfSuper.add(longAsNumber);
这相当于您的问题中的代码段。最后一行应该编译吗?如果这样,它将违反的通用不变式
List<Integer>。
根据您的评论,
List<? super Integer>在您的示例中确实是不必要的。更常见的情况是为方法参数增加灵活性。例如一种方法
void addInt(List<Integer> list) { list.add(1);}
将只能接受
List<Integer>,这将是不必要的限制。将参数类型更改为
List<? superInteger>会允许该方法接受
List<Integer>以及
List<Number>,其中任何一个都可以包含一个
Integer值。
仅当列表 使用相关 的泛型类型时,此方法才有效。如果该方法尝试从列表中 产生
值,则
Object由于我们没有确定的超类型,将被迫假定它们为类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)