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的变量,而还可以读取出来啊???

解决方案 »

  1.   

    读出来的就是String
    将System.out.println(list.get(0));改为:System.out.println(list.get(0) + 1);就能看出来了
      

  2.   

    貌似我以前听说,这种情况可以自动转换成integer类型
      

  3.   

    list是引用类型,
    因为append(List list)里没有指定list的元素类型,
    list里面又可以add任何<E>元素了,
    要是改成 append(List<Integer> list),
    应该就不能add Integer型以外的元素了。
      

  4.   


    public static void append(List<Integer> list)方法里要加<Integer>
      

  5.   


    + 1 就出错了,取出来的还是String类型
      

  6.   

    System.out.println(list.get(0) );这一句是比较神奇的,如果你改成
    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)
    没报异常呢?
      

  7.   

    参考了一些文章,知道了个大概
    泛型这东西是只在编译阶段有效的。在字节码文件中是不带入任务类型信息的。泛型的好处在于编译时帮助程序员检查类型是否有错误。
    也就是说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 )则报异常
      

  8.   

     
    flagiris
     
    (菖蒲芭芭) 等 级:  #3楼 得分:0回复于:2011-10-11 08:53:28list是引用类型,
    因为append(List list)里没有指定list的元素类型,
    list里面又可以add任何<E>元素了,
    要是改成 append(List<Integer> list),
    应该就不能add Integer型以外的元素了。3楼正解顶