泛型类的getClass()

时间:2017-03-29 14:47:15

标签: java generics

问题是我需要获得类似T.class的内容,因为veryImportantMethod(来自下面的示例)具有Class参数。

public abstract class Something<T> {

    public abstract Class<T> getGenericClass();

}



public class Example extends Something<Example> {
    @Override
    public Class<Example> getGenericClass() {
        return Example.class;
    }
}

public static abstract class BaseDao<T extends Something<T>> extends Amazing {

        T type;

        public T doSomething() {
            this.veryImportantMethod(type.getGenericClass()); 
        }

}

public static class Son extends BaseDao<Example> {
}

其实我正在

  

...读取未写字段... NP_UNWRITTEN_FIELD

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我不是100%确定这是否是你所追求的......但

首先,定义的Example.getGenericClass完全没用,你可以获得相同的答案但是在Example类型变量上调用getClass,

Example example = new Example();
example.getClass() == Example.class; // always true. 

因此,如果您可以保证type始终具有非空值,则只需在其上调用type.getClass()即可。

如果type可能为null,那么除非您通过单独引用该类来记录该类,否则您将失去运气。我怀疑type只是获得Example.class。在那种情况下最好的 直接指向Class对象。此引用必须由构造函数初始化,并且通常只有使其成为最终才有意义,因为它不应在包含对象的实时期间更改。

public static abstract class BaseDao<T extends Something<T>> extends Amazing {

        private final Class<T> clazz;

        public BaseDao(final Class<T> clazz) {
           this.clazz = clazz;
        }

        public void doSomething() {
            this.veryImportantMethod(clazz); 
        }
}
...
class ExampleDao extends BaseDao<Example> {
      public ExampleDao() {
         super(Example.class);
      }
}
...