public class Test1{
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
append(list);
System.out.println(list.get(0));
}
public static void append(List list){
list.add("0042");
}
}为什么我定义的是integer类型的list,使用方法加入了String的变量,而还可以读取出来啊???
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
append(list);
System.out.println(list.get(0));
}
public static void append(List list){
list.add("0042");
}
}为什么我定义的是integer类型的list,使用方法加入了String的变量,而还可以读取出来啊???
将System.out.println(list.get(0));改为:System.out.println(list.get(0) + 1);就能看出来了
因为append(List list)里没有指定list的元素类型,
list里面又可以add任何<E>元素了,
要是改成 append(List<Integer> list),
应该就不能add Integer型以外的元素了。
public static void append(List<Integer> list)方法里要加<Integer>
+ 1 就出错了,取出来的还是String类型
System.out.println(list.get(0) +1);是要报类型转换异常的
我测了了一下,得出一个结论供参考。
System.out.println(obj);这句会把obj先转换成Object类型,然后再调用它的toString()方法,所以你直接输出list.get(0)不会报异常
但是还有个疑问,在ArrayList源码中 public E get(int index) {
RangeCheck(index); return (E) elementData[index];
}这么写的话为什么list.get(0)
没报异常呢?
泛型这东西是只在编译阶段有效的。在字节码文件中是不带入任务类型信息的。泛型的好处在于编译时帮助程序员检查类型是否有错误。
也就是说lz写的代码成功骗过了编译器,也成功骗过了这一句list.get(0)
编译器虽然认为list.get(0)是Integer类型,但是list.get(0)在虚拟机中运行后得到是String类型,所以但是如果把System.out.println(list.get(0) )不报异常,而变成System.out.println(list.get(0)+1 )则报异常
flagiris
(菖蒲芭芭) 等 级: #3楼 得分:0回复于:2011-10-11 08:53:28list是引用类型,
因为append(List list)里没有指定list的元素类型,
list里面又可以add任何<E>元素了,
要是改成 append(List<Integer> list),
应该就不能add Integer型以外的元素了。3楼正解顶