【问题标题】:How to get generic's class如何获得泛型类
【发布时间】:2010-02-08 16:50:19
【问题描述】:
Class Model<T>{

   private T t;

   .....


   private void someMethod(){
       //now t is null
       Class c = t.getClass();
   } 

   .....

}

当然会抛出 NPE。

Class c = t.getClass();

如果我的实例为空,我应该使用什么语法来获取 T 类? 有可能吗?

【问题讨论】:

  • 如果你的实例为空,怎么会有类类型?
  • 据我所知,这是不可能的。请记住,泛型是编译时的,而不是运行时的。处理这个问题的一个更常见的方法是存储一个 Class 对象来保存这个类(如果你真的需要它)。
  • 同意,Kylar 和 froadie:您需要为“t”添加额外的非空值检查。

标签: java generics syntax


【解决方案1】:

由于类型擦除,这是不可能的。

有以下解决方法:

class Model<T> { 

    private T t; 
    private Class<T> tag;

    public Model(Class<T> tag) {
       this.tag = tag;
    }

    private void someMethod(){ 
       // use tag
    }  
} 

【讨论】:

    【解决方案2】:

    你可以通过反射来做到这一点:

    Field f = this.getClass().getField("t");
    Class tc = f.getType();
    

    【讨论】:

      【解决方案3】:

      不通过类也可以做到:

      class Model<T> {
        Class<T> c = (Class<T>) DAOUtil.getTypeArguments(Model.class, this.getClass()).get(0);
      }
      

      您需要此文件中的两个函数:http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil.java

      更多解释:http://www.artima.com/weblogs/viewpost.jsp?thread=208860

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 2021-05-13
        • 1970-01-01
        • 2019-08-25
        • 2021-06-16
        • 1970-01-01
        • 2016-04-19
        相关资源
        最近更新 更多