我的代碼是:實例化一個泛型類型
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
但是,編譯器不接受新T()。有沒有辦法做到這一點使用構造函數MyClass(),沒有參數?
我的代碼是:實例化一個泛型類型
public class MyClass<T extends MyComponent> {
private T t;
public MyClass(){
t = new T();
}
}
但是,編譯器不接受新T()。有沒有辦法做到這一點使用構造函數MyClass(),沒有參數?
由於類型擦除,JVM不知道什麼是T
,所以它不能實例化它。解決方法是提供Class<T>
並用它來創建一個新的實例:
public MyClass(Class<T> clazz)
{
t = clazz.newInstance();
}
你必須添加醒目IllegalAccessException
和InstantiationException
。
你可以做
public class MyClass<T extends MyComponent> {
private T t;
Class<T> clazz;
MyClass(Class<T> clazz) throws InstantiationException,
IllegalAccessException {
t = clazz.newInstance();
}
}
不是沒有獲得T的類對象。想一想,T可以是MyComponent的任何子類,你甚至可以決定哪個構造函數可用於該特定的子類?
類型擦除意味着編譯器默默地用MyComponent替換對T的所有「真實」引用。
如果你有一個Class的引用,你可以調用Class#newInstance
,或者獲得一個構造函數並調用它。
在構造函數中指定''T''作爲參數。 – qqilihq
如果你的T類沒有一個空構造函數會發生什麼? – porfiriopartida
我的T類有一個空的構造函數 – user1902062