繁体   English   中英

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

[英]Any way to get generic T class object from static method(without calling constructor)?

这是代码的样子

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.的结构。

这有可能吗?

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

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

应该这样做。 或者,如果你可以使用第三方库,那么Guava的TypeToken就会像(Class<T>) new TypeToken<T>(getClass()).getType()

你可以这样做的原因是, A<RealClass>被硬编码-这是一个具体的类型参数,而不像一般的对象类型,泛型类型和的超类型是通过类型擦除保存。

我想要的是能够从某种方法接收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类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM