在Java中降低有界通配符

时间:2018-03-18 19:52:12

标签: java generics wildcard

考虑以下示例,

List<? super Number> list1 = new ArrayList<>();
list1.add(10);
list1.add(10.10);
list1.add(20.20d);

以及我指定 list1

的另一个列表
List<? super Integer> list = list1;
System.out.println(list.toString());

现在,当我打印列表时,它包含双重值但是该列表只能保存Integer和Integer 之外的任何内容。

如果以上情况还可以,那么下面的编译也不应该?

list.add(30.30);

1 个答案:

答案 0 :(得分:5)

如果您考虑可以分配给它的可能事项,那么一切都有意义。

List<? super Number> list1 = new ArrayList<Object>(); // works
List<? super Number> list1 = new ArrayList<Number>(); // works
List<? super Number> list1 = new ArrayList<Integer>(); // doesn't work

右侧有效的任何内容都会接受Double

List<? super Integer> list = new ArrayList<Object>(); // works
List<? super Integer> list = new ArrayList<Number>(); // works
List<? super Integer> list = new ArrayList<Integer>(); // works

您可以分配给list1的任何内容,您也可以分配给list。所以list = list1工作正常。但您可以分配给list的所有内容都会接受Double,因此无法编译。