泛型的疑惑。。
我在看泛型方面的东西时,遇到这样一种说法:
如果类型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;
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
泛型只是编译的时候给错误提示,在运行的时候是没泛型这个东西的。