我试图理解以下代码片段,在 stackoverflow 上搜索了关于 lowerbound 的链接和 upperbound
只是试图克服以下行中的困惑,
si=s//OK why? arrays of objects can be implicitly casted to arrays of integers?
List<? extends Number> l = new ArrayList<>();
List<? extends Integer> i = new ArrayList<>();
l = i;//OK i is a subtype of l
List<? super Number> s = new ArrayList<>();
List<? super Integer> si = new ArrayList<>();
si = new ArrayList<Integer>();//OK understand integer matches the pattern of ? super Integer
s = new ArrayList<Object>();//OK understand that object is superclass of Number
si=s//OK why? arrays of objects can be implicitly casted to arrays of integers?
//consider this
List<Integer> integers = new ArrayList<Integer>();
List<Object> objects = new ArrayList<Object>();
integers = objects; //NOT OK Type mismatch: cannot convert from List<Object> to List<Integer>
//consider this
Integer ten = 10; //integer ten
Object none = new Object();//some none
ten = none;//NOT OK none cannot be implicitly casted to ten
感谢任何帮助
最佳答案
请记住,gnerics 是为了编译器的利益而不是运行时信息。
当您执行 si = s
时,您将一个 Number 父类(super class)的列表分配给一个变量,该变量可以引用 Integer 父类(super class)的列表。
如果它是一个 Number 列表,它仍然是一个 Something 列表,它是 Integer 的父类(super class)。
我们知道它实际上是一个 Object 的数组列表,因为您之前已经分配过。
我们还知道 ArrayList of Object 扩展了 List of Object。
Object 列表是 Number 父类(super class)的列表,这就是之前的赋值有效的原因。
我们还知道 List of Object 是 Integer 的父类(super class)的列表,但这与编译器无关,它只关心 Number 的任何父类(super class)也是 Integer 的父类(super class)。
关于java - 下界通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085313/