【问题标题】:Get class of generic获取泛型类
【发布时间】:2011-07-22 22:26:15
【问题描述】:

我的课开始于

public abstract class LastActionHero<H extends Hero>(){

现在我想在代码中的某处写H.class,但这是不可能的(比如String.classInteger.class 是)。

你能告诉我如何获得泛型的Class 吗?

【问题讨论】:

    标签: java class generics types parameterized


    【解决方案1】:

    不通过类也可以做到:

    public abstract class LastActionHero<H extends Hero>() {
      Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.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

    【讨论】:

      【解决方案2】:

      我们通过以下方式进行:

          private Class<T> persistentClass;
      
          public Class<T> getPersistentClass() {
              if (persistentClass == null) {
                  this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
              }
              return persistentClass;
          }
      

      【讨论】:

        【解决方案3】:

        您可以动态提供类型,但编译器不会自动为您执行此操作。

        public abstract class LastActionHero<H extends Hero>(){
            protected final Class<H> hClass;
            protected LastActionHero(Class<H> hClass) {
                this.hClass = hClass;
            }
            // use hClass how you like.
        }
        

        顺便说一句:动态获取它并非不可能,但这取决于它的使用方式。例如

        public class Arnie extends LastActionHero<MuscleHero> { }
        

        可以确定 Arnie.class 有一个超类,其 Generic 参数为 MuscleHero。

        public class Arnie<H extend Hero> extends LastActionHero<H> { }
        

        在这种情况下,超类的通用参数将只是H

        【讨论】:

          【解决方案4】:

          一种方法是保持对参数化类型的引用,例如具有属性

          private Class<H> clazz;
          

          并创建一个接受Class&lt;H&gt; 的setter 或构造函数。

          参数化类型在运行时被删除,因此你不能按照你的要求去做。

          【讨论】:

            【解决方案5】:

            你不能 - 类型在运行时被删除并且只在编译时存在。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-20
              • 1970-01-01
              • 2021-10-15
              • 1970-01-01
              • 1970-01-01
              • 2010-12-28
              相关资源
              最近更新 更多