ArrayList<Integer> list = new ArrayList<Integer>(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象
希望给出源代码和详细解析求助!

解决方案 »

  1.   

    我一直弄不清楚这个泛型,在我在看帖子http://bbs.csdn.net/topics/390349747时,偶尔测试发现可以的。但不知道这是为什么?也许我理解错误,希望给予指正。可以把这个list赋值给一个非泛型的ArrayList变量,就可以加进去其他对象。import java.util.*;
    public class AddStringToIntegerList{
        public static void main(String[] args){
            ArrayList<Integer> aList = new ArrayList<Integer>();
            aList.add(1);
            aList.add(2);
            ArrayList list=aList;//把泛型对象赋值给非泛型变量.
            list.add("abc");     //通过这个变量加入非Integer内容。
            System.out.println(aList.size());
            for(Object o:aList){
                System.out.println(o);
            }
        }
    }
      

  2.   

    因为所有的java的类都默认继承自Object类。所以根据java多态的特性。子类的实例都包含有一个父类(基类)的对象引用。因为实例alist 和list都同时指向了一个Arraylist的实例。关键是list这个对象引用没有进行泛型的强制说明,因此该list可以聚集字符串类型的变量。但是在引用这些变量的时候必须进行向上类型转换才可以。否则编译器回编译不通过。因此才有了那个for循环必须用Object类型。
      

  3.   

    二楼的头像很sexy哈。给枯燥的技术专区带了很大的波澜呀。
      

  4.   

    泛型只是在编译期检查而已,编译后是会被擦除掉的。只是内部会多一步强转的过程,由于这一特性所以要骗过他就不能用正常的写法进行的add。用反射就可以了。
    ArrayList<Integer> list = new ArrayList<Integer>();
    Method method=list.getClass().getMethod("add",Object.class);//获取他的add方法
    method.invoke(list,"testAddStringOnIntergerGenericList");//在list上调用add相当于list.add
    System.out.println(list.get(0));//你就会发现已经添加进去了