java - 下界通配符

标签 java generics bounded-wildcard

我试图理解以下代码片段,在 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/

相关文章:

java - 关于Java中通配符的简单说明

java - Swing JProgressBar 没有像我期望的那样重绘

java - 如何关闭 tomcat 7 中的 jul 日志格式?

java - 类访问内部类私有(private)?

ios - 将请求函数转换为通用类型

接口(interface)中方法的java泛型类型参数

java - 如何使用 "extends"使用具有排他性绑定(bind)的泛型?

java - 什么是 PECS(生产者扩展消费者 super )?

java - HDIV + Spring MVC - 总是出现未经授权的访问错误 HDIV_PARAMETER_DOES_NOT_EXIST

java - 类型 安全警告