代码如下所示
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的协处理器。
这有可能吗?
答案 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
类型。