考虑下面的例子,
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());
现在,当我打印列表时,它也包含 double 值但是列表应该只包含整数和整数以上的任何值。
如果上面的没问题,那么下面的不应该编译吗?
list.add(30.30);
最佳答案
如果您考虑可以分配给它的可能事物,那么一切都有意义。
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
,因此它不会编译。
关于java - java中的下界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352210/