日期:2014-05-20  浏览次数:20887 次

泛型的疑惑。。
我在看泛型方面的东西时,遇到这样一种说法:

如果类型a与类型b有继承关系,那么a[]与b[]也有继承关系。但是泛型就没有这个特点,并举例说道:
如果类型a与类型b有继承关系,那么List<a>与List<b>一毛钱关系都没有。

而且假设关系成立,那么程序将出现很多错误:

List<Integer> li = new ArrayList<Integer>(); 
List<Number> ln = li; // illegal 
ln.add(new Float(3.1415));

这将导致li中放入Float对象。我觉得很有道理。。但是呢,问题来了,java允许这么做:

List<Integer> li = new ArrayList<Integer>();
List lo = li;

这个不带类型参数的List将会被擦除到类型参数的上限,就是Object,那我接下来这么做

List<Integer> li = new ArrayList<Integer>();
List lo = li;
lo.add(new Float(100f);

这不就和开头的情况一样了么??

各位大侠 这Java语言设计得让我非常困惑。。。。

------解决方案--------------------
记住 List<Number> ln = li; // illegal
就行了,就是这么设计的。
------解决方案--------------------
这是一个编译错误!
在java里,有一个叫做“类型擦除”的概念,你可以查一下。

List<Integer> 这里只能放Integer一个类型的,如果不是,就会出现编译错误

但是有一种这样的写法:
List<? super Integer>
List<? extends Number>

其实你的想法,可以通过以下方法实现:
Java code
List<Integer> li = new ArrayList<Integer>();
li.add(1);
List<? extends Number> ln = li;

------解决方案--------------------
探讨

恩 我就是觉得List lo = li;这句和书上说的设计理论抵触。。。

------解决方案--------------------
探讨

这是一个编译错误!
在java里,有一个叫做“类型擦除”的概念,你可以查一下。

List<Integer> 这里只能放Integer一个类型的,如果不是,就会出现编译错误

但是有一种这样的写法:
List<? super Integer>
List<? extends Number>

其实你的想法,可以通过以下方法实现:
Java code
List<Integer>……

------解决方案--------------------
泛型只是编译的时候给错误提示,在运行的时候是没泛型这个东西的。