【发布时间】:2016-04-09 10:17:27
【问题描述】:
我正在阅读 Java atm 中的泛型,事情进展得有点慢,希望能有所帮助。我从 Oracles 自己的数据库中读取:
https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html
在底部我们可以看到List<Integer>是List<? extends Number>的子类型
我也遇到了这个stackoverflow问题:
Java Generic type : difference between List <? extends Number> and List <T extends Number>
在一个答案中说:这是真的:
((List<Integer>)list).add((int) s);
我已经验证过了,没关系。但我完全不明白。
如果通配符是 Short 类并且我添加了一个大于 2^15-1(=32767) 的数字,它不应该报错吗?
我什至尝试过类似的方法,但效果很好:
import java.util.*;
class CastingWildcard{
public static void main(String[] args){
List<? extends Number> list = new ArrayList<Short>();
int s=32770;
((List<Integer>)list).add((int) s);
System.out.println(list.get(0));
}
}
总结一下:为什么我可以将List<? extends Number>转换为List<Integer>,而通配符可以是Short,甚至是Byte,它也扩展了Number?
【问题讨论】: