java - 具有有界通配符类型的数字列表列表

标签 java generics

如果我有这个,

Collection<? extends Number> c = new ArrayList<>();
c.add(new Integer(1)); // Compile time error

因为我们不知道c的元素类型代表什么,所以我们不能给它加整数。

如果我喜欢,

List<List<? extends Number>> history = new ArrayList<>();

List<Integer> integers = new ArrayList<>();
integers.add(new Integer(1));

List<Double> doubles = new ArrayList<>();
doubles.add(new Double(2));

history.add(integers); // This is allowed
history.add(doubles);  // This is allowed

为什么允许在第二个示例中添加?

最佳答案

Collection<? extends ...>
c.add(...);

无法添加具有下限的集合。

List<List<...>> history;
history.add(...);      // Allowed

外部列表具有具体类型。 ? extends 通配符在内部列表中,但它无关紧要,因为您要添加到外部列表。我用 ... 替换了通配符,因为当您调用 history.add() 时它是什么并不重要。

如果外部列表有通配符绑定(bind),则添加将失败。

List<? extends List<...>> history;
history.add(...);      // NOT allowed

关于java - 具有有界通配符类型的数字列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56350451/

相关文章:

java - JProfiler 中“热点” View 和“方法统计” View 中方法排序的差异

java - Maven多模块项目的构建顺序?

c# - 将枚举值作为参数的通用 C# 方法

java - 在 Java 中扩展泛型类型

c# - 使用泛型的列的最大值

java - 为什么常见的 Map 实现不为 Map.get() 缓存 Map.containsKey() 的结果

java - processBuilder 的进程永远不会结束

Java 显示特殊字符的错误以及来自 Mysql 的数据以及 utf8 的自定义排序规则(as,ci)

c# - 如何使用反射调用泛型方法?

java - 泛型删除和遗留代码