从静态方法获取泛型T类对象的任何方法(不调用构造函数)?

时间:2016-03-30 20:03:49

标签: java

代码如下所示

abstract class A<T>
{
   T panel;
   public A()
   {
      code here does something I don't want to be called, and I can't overload it)
   }
   abstract T createPanel();
}
...
class B extends A<RealClass>
{
   ...
   @Override
   RealClass createPanel()
   { 
      return new RealClass();
   }
}

我想要的是能够从某种方法接收 RealClass.class ,只有Class cls = B.class;并且不调用任何B的协处理器。

这有可能吗?

2 个答案:

答案 0 :(得分:2)

是的,这实际上是您可以执行此操作的情况之一。

(Class<?>) ((ParameterizedType) getClass().getGenericSuperclass())
     .getActualTypeArguments()[0]

应该这样做。或者,如果您可以使用第三方库,Guava的TypeToken会使其类似于(Class<T>) new TypeToken<T>(getClass()).getType()

你可以这样做的原因是A<RealClass>是硬编码的 - 它是具体的类型参数,与通用类型的对象不同,泛型类型和超类型 classes 通过类型擦除保留。

答案 1 :(得分:1)

  

我想要的是能够从某种方法接收RealClass.class,只有Class cls = B.class;

你需要获得父母的通用。

Type type = cls.getGenericSuperClass();
if (type instanceof ParameterizedType) {
    ParameterizedType ptype = (ParameterizedType) type;
    Class genericType = (Class) ptype.getActualTypeArguments()[0];
}

此类型仅在信息包含在字节代码中时可用。如果你有

,这将不起作用
class B<T> extends A<T>

因为getActualTypeArguments()[0]会返回T类型。