Get class of generic

前端 未结 5 982
野趣味
野趣味 2020-12-16 05:22

My class starts with

public abstract class LastActionHero(){

Now somewhere in the code I want to write H.class<

相关标签:
5条回答
  • 2020-12-16 05:26

    You can't- the type is erased at run-time and exists only at compile-time.

    0 讨论(0)
  • 2020-12-16 05:33

    One way is to keep reference to your parameterized type like having an attribute of

    private Class<H> clazz;
    

    And create a setter or a constructor that takes in a Class<H>.

    Parameterized Types are erased at runtime, hence why you can't do what you ask.

    0 讨论(0)
  • 2020-12-16 05:35

    We do it in the following way:

        private Class<T> persistentClass;
    
        public Class<T> getPersistentClass() {
            if (persistentClass == null) {
                this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
            }
            return persistentClass;
        }
    
    0 讨论(0)
  • 2020-12-16 05:42

    You can provide the type dynamically, however the compiler doesn't do this for you automagically.

    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.
    }
    

    BTW: It not impossible to get this dynamically, but it depends on how it is used. e.g

    public class Arnie extends LastActionHero<MuscleHero> { }
    

    It is possible to determine that Arnie.class has a super class with a Generic parameter of MuscleHero.

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

    The generic parameter of the super class will be just H in this case.

    0 讨论(0)
  • 2020-12-16 05:46

    You can do it without passing in the class:

    public abstract class LastActionHero<H extends Hero>() {
      Class<H> clazz = (Class<H>) DAOUtil.getTypeArguments(LastActionHero.class, this.getClass()).get(0);
    }
    

    You need two functions from this file: http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil.java

    For more explanation: http://www.artima.com/weblogs/viewpost.jsp?thread=208860

    0 讨论(0)
提交回复
热议问题