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

Shi*_*han 5 java generics

如果我有这个

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

由于我们不知道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
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ica 9

Collection<? extends ...>
c.add(...);
Run Code Online (Sandbox Code Playgroud)

具有下限的集合不能添加到其中。

List<List<...>> history;
history.add(...);      // Allowed
Run Code Online (Sandbox Code Playgroud)

外部列表具有具体类型。该? extends通配符是内部列表里面,但因为你是增加了外部列表是无关紧要的。我已将通配符替换为,...因为无论您打来什么电话都没关系history.add()

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

List<? extends List<...>> history;
history.add(...);      // NOT allowed
Run Code Online (Sandbox Code Playgroud)