2016-03-30 58 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>硬編碼 - 這是一個具體的類型參數,不像一般類型對象,泛型類型和的超類型的通過類型擦除保存。