在Java中降低有界通配符

Adi*_*hya 1 java generics wildcard

考虑以下示例,

List<? super Number> list1 = new ArrayList<>();
list1.add(10);
list1.add(10.10);
list1.add(20.20d);
Run Code Online (Sandbox Code Playgroud)

和另一个我分配list1的列表

List<? super Integer> list = list1;
System.out.println(list.toString());
Run Code Online (Sandbox Code Playgroud)

现在,当我打印列表时,它包含双精度值,但是列表只能保存整数和整数以上的任何值.

如果以上是好的,那么下面的编译也不应该这样吗?

list.add(30.30);
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 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
Run Code Online (Sandbox Code Playgroud)

任何在右手边工作的东西都会接受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
Run Code Online (Sandbox Code Playgroud)

您可以分配给list1您的任何内容也可以分配给list.所以list = list1工作得很好.但并非所有你可以分配的东西list都会接受a Double,所以它不会编译.