2012-10-07 77 views
5

如果我有這樣的:捕獲泛型類型在Java中

class Test<T extends X> { 
    public T test() { 
     T t = /* ... */; 
     return t; 
    } 
} 

我怎樣才能捕捉T的課,所以我可以實例呢?是否有解決方法來防止類型擦除?我甚至不需要訪問T的方法,X的做得很好,但我需要返回一個T

回答

4

您可以做的唯一事情是將T的類作爲額外參數傳遞給test()或在類Test中設置成員字段。您無法防止類型擦除。

class Test<T extends X> { 
    private Class<T> mClass; 
    public Test(Class<T> c) { 
     mClass = c; 
    } 
    public T test() { 
     T t = mClass.newInstance(); 
     return t; 
    } 
} 

或者你可以傳遞一個工廠對象來達到同樣的效果。當你需要使用默認構造函數以外的東西時,這很有效。

+0

mClass.getConstructor()的newInstance()是更好的,因爲它沒有隱藏檢查異常,但適當的包裝他們的InvocationTargetException。 –

3

把它定義爲:

class Test<T extends X> 
{ 
    public T test(Class<T> c) 
    { 
     T t = c.newInstance(); 
     return t; 
    } 
} 

,並用它喜歡:

Test<Foo> t = new Test<Foo>(); 
t.test(Foo.class); 
0

你不能直接這樣做,但你可以添加牛逼實現創建實例的接口,或T的數組。