怎样得到泛型的存储类型啊?
比如说 List<User> list = null,我怎样知道这个list存储的是User的集合,不要说用list.get(i),这里的list=null

解决方案 »

  1.   

    User user = new User();
    list.add(user);
      

  2.   

    可能我说的不太清楚,我的意思是我怎样知道list里面放的是User对象,
      

  3.   


    参考一下,或许对你有用:
    import java.util.*;
    import java.lang.reflect.*; 
    class User{
    }
    public class GenericTest{
      public static List<User> list=null;
      public static void main(String args[])throws Exception{
           Class<GenericTest> clazz = GenericTest.class;
       Field field=clazz.getDeclaredField("list");
           Type type=field.getGenericType(); 
           System.out.println(type);
      }
    }
      

  4.   

    List是个容器,泛型参数规定了这个容器里面能放什么
      

  5.   

    List<User> list = null;
    这样的写法你都是已知的泛型了,还需要判断么?
    除非是
    List<Object> list = null;
    你在不知道当前泛型的时候,可以使用
    if(list.get(i) instanceof User) {
    ...
    }
    这样的判断,来确定你的泛型。
      

  6.   

    5楼的正合我意,可是现在又出了个问题,
    Type type=field.getGenericType(); 得到了type,那我怎样实例化User这个对象呢,
    本来是准备Class.forName(type.toString).newInstance()的;但是type.toString前面有个class 的说明,我不想通过subString来得到,有没有更好的解决办法?
      

  7.   

    我现在在为公司搭一个框架,List<Object> 这个Object会传入不同的对象,我需要得到它的实体对象
      

  8.   


    private static Class readGeneric(String name) throws Exception {
            Field list = MainTest.class.getDeclaredField(name);
            list.setAccessible(true);
            if (list.getGenericType() instanceof ParameterizedType) {
                ParameterizedType pt = (ParameterizedType)   
                                                      list.getGenericType();
                return (Class) pt.getActualTypeArguments()[0];
            }else{
                throw new RuntimeException("不是泛型");
            }
        }把list传一下就行了
      

  9.   

    List<User> list = null;
      

  10.   

    对呀  按照楼主的写法,是已经知道里面放的是User的,干吗还要判断
      

  11.   

    我是有点纳闷了
    你都List<User>了,还判断放的是什么?
      

  12.   

    先遍历
    Iterator i = (User).iterator();
    while(i.hasNext()){
        User users=(User)i.next();
    }
    再加一个方法
    public void addUser(User user){
         users.add(user);
    }
    这个要到实际当中才能真正的体会到其中的好处所在
      

  13.   

    对的,Java 中的泛型只在编译期起作用,编译完了之后这些信息就没有了,因此在运行期无法获得泛型参数类型。
      

  14.   

    感觉LZ这么做没什么意义,如果真的有意义的话,可以自己重写List类,加入你要的东西。
      

  15.   

    随便插入个什么东西,在catch里面标志下不就ok了
      

  16.   

    如果是不定型,可以采用5L的反射机制来判断是何种泛型。获得泛型后,可以根据泛型名称去getInstance()去获取实例。当然前提是该类里有这个方法。一般这种情况下,我们都会在需要获许实例的类里写个getInstance()方法。//如果是类
    Class<?> classs = Class.forName(根据类反射机制获取的类名,要有完整的包路径);//加载类
    Class[] argClass = {};//参数
    //Class[] argClass = {Integer.class,Double.class};//参数
    Constructor<?> cons = classs.getConstructor(argClass);//获得此类的构造器
    Object[] args = {};//构造器参数
    cons.newInstance(args);//实例化基本就是这样了。
      

  17.   

    List<User> list = null;
    这样的写法你都是已知的泛型了啊!
      

  18.   

    List<User>  规定了装入的就是User啊,还判断什么啊?建议楼主看看泛型的定义
      

  19.   

    如何实例化可以参考http://java.sun.com/docs/books/tutorial/reflect/member/ctorInstance.html
    Constructor[] ctors = Class.class.getDeclaredConstructors();
    //比如调用12楼就可以得到这里的ClassConstructor ctor = null;
    for (int i = 0; i < ctors.length; i++) {
      ctor = ctors[i];
      if (ctor.getGenericParameterTypes().length == 0)
    break;
    }   try {
        
     ctor.setAccessible(true);
               
     Object retobj = ctor.newInstance();
     
     }
     catch (Throwable e) {
            System.err.println(e);
     }