如果我有這樣的:捕獲泛型類型在Java中
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
我怎樣才能捕捉T
的課,所以我可以實例呢?是否有解決方法來防止類型擦除?我甚至不需要訪問T
的方法,X
的做得很好,但我需要返回一個T
。
如果我有這樣的:捕獲泛型類型在Java中
class Test<T extends X> {
public T test() {
T t = /* ... */;
return t;
}
}
我怎樣才能捕捉T
的課,所以我可以實例呢?是否有解決方法來防止類型擦除?我甚至不需要訪問T
的方法,X
的做得很好,但我需要返回一個T
。
您可以做的唯一事情是將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;
}
}
或者你可以傳遞一個工廠對象來達到同樣的效果。當你需要使用默認構造函數以外的東西時,這很有效。
把它定義爲:
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);
你不能直接這樣做,但你可以添加牛逼實現創建實例的接口,或T的數組。
mClass.getConstructor()的newInstance()是更好的,因爲它沒有隱藏檢查異常,但適當的包裝他們的InvocationTargetException。 –