2016-03-30 23 views
1

这里是代码的样子任何方式从静态方法(无需调用构造函数)获取泛型T类对象?

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.

的任何costructors

是这样可能以任何方式?

+5

'static'在这里发挥了什么作用? – radoh

+0

我在这里找到的所有方法都来自B()构造函数(因此它们需要B类实例,不像静态方法)。我想在类A中使用静态方法,它将子类类对象作为参数,并返回子类T类对象(对于B,它是RealClass.class) – maxpovver

回答

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型这是行不通的。

+1

谢谢!这工作! ps plz fix cls.getGenericSuperClass - > cls.getGenericSuperclass – maxpovver

2

是的,这实际上是您可以做到的一种情况。

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

应该这样做。或者,如果您可以使用第三方库,番石榴的TypeToken会使这个东西像(Class<T>) new TypeToken<T>(getClass()).getType()

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