2013-09-26 224 views
-1

我的代碼是:實例化一個泛型類型

public class MyClass<T extends MyComponent> { 
    private T t; 
    public MyClass(){ 
     t = new T(); 
    } 
} 

但是,編譯器不接受新T()。有沒有辦法做到這一點使用構造函數MyClass(),沒有參數?

+0

在構造函數中指定''T''作爲參數。 – qqilihq

+1

如果你的T類沒有一個空構造函數會發生什麼? – porfiriopartida

+0

我的T類有一個空的構造函數 – user1902062

回答

1

由於類型擦除,JVM不知道什麼是T,所以它不能實例化它。解決方法是提供Class<T>並用它來創建一個新的實例:

public MyClass(Class<T> clazz) 
{ 
    t = clazz.newInstance(); 
} 

你必須添加醒目IllegalAccessExceptionInstantiationException

2

你可以做

public class MyClass<T extends MyComponent> { 
    private T t; 

    Class<T> clazz; 

    MyClass(Class<T> clazz) throws InstantiationException, 
      IllegalAccessException { 
     t = clazz.newInstance(); 
    } 

} 
1

不是沒有獲得T的類對象。想一想,T可以是MyComponent的任何子類,你甚至可以決定哪個構造函數可用於該特定的子類?

類型擦除意味着編譯器默默地用MyComponent替換對T的所有「真實」引用。

如果你有一個Class的引用,你可以調用Class#newInstance,或者獲得一個構造函數並調用它。