如果我有这个
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)
为什么在第二个示例中允许加法?
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)