日期:2014-05-20  浏览次数:20775 次

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

------解决方案--------------------
不可能实现的,只能存同一类型的数据
------解决方案--------------------
我一直弄不清楚这个泛型,在我在看帖子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);
        }
    }
}

------解决方案--------------------
因为所有的java的类都默认继承自Object类。所以根据java多态的特性。子类的实例都包含有一个父类(基类)的对象引用。因为实例alist 和list都同时指向了一个Arraylist的实例。关键是list这个对象引用没有进行泛型的强制说明,因此该list可以聚集字符串类型的变量。但是在引用这些变量的时候必须进行向上类型转换才可以。否则编译器回编译不通过。因此才有了那个for循环必须用Object类型。
------解决方案--------------------
二楼的头像很sexy哈。给枯燥的技术专区带了很大的波澜呀。
------解决方案--------------------
泛型只是在编译期检查而已,编译后是会被擦除掉的。只是内部会多一步强转的过程,由于这一特性所以要骗过他就不能用正常的写法进行的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));//你就会发现已经添加进去了

------解决方案--------------------
引用:
泛型只是在编译期检查而已,编译后是会被擦除掉的。只是内部会多一步强转的过程,由于这一特性所以要骗过他就不能用正常的写法进行的add。用反射就可以了。
ArrayList<Integer> list = new ArrayList<Integer>();
Method method=list.getClass().getMethod("add",Object.class……


学习,原来通过反射可以这样做啊