这个问题,其实也是由于“泛型绕过了编译器”而引起的。
仔细看看ArrayList<E>的源代码,虽然这个类使用了泛型,但是保存数据的数组,确是Object类型的。[code=java]private transient Object[] elementData;[/code]最初,您的代码为:[code=java]List<Integer> intList = new ArrayList<Integer>(); [/code]定义一个List<Integer>的变量intList 。 此时intList 的add()方法中仅可以添加Integer类型的对象,否则编译报错。
然后,您的代码为:[code=java]append(intList); [/code]其实就相当于:List list = new ArrayList<Integer>();
换种写法就是:List<?> list = new ArrayList<Integer>(); 。此时,其实就擦除了list的泛型。
也就是说,编译器不会再阻止咱们向list中插入String对象了。事实上,现在咱们可以为所欲为,向其内插入任意Object对象。
因此,在您写的append()方法中,咱们成功的将String类型的数据插入到那个名为elementData的Object[]数组之中了。
相应的调用intList.get()方法,就是从Object[]数组中取出数据。
但是,还是有个问题,下面是ArrayList类中get()方法的源代码:[code=java]public E get(int index) {
RangeCheck(index);
return (E) elementData[index];
}[/code]返回值的类型为E类型,在List<Integer> intList中,E为Integer。
但是咱们调用intList.get()方法,却成功返回了一个String类型的对象。好神奇。到了后面学了反射应该就会更明白了! |