2010-07-06 88 views
2

的我的問題是這樣的:實例類型的通用

爲什麼不能實例化一個泛型類型的類級,你可以做的新T(),而是用的newInstance()?

+0

關聯:http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in​​-java,http://stackoverflow.com/questions/731452/create-instance-of-泛型 – 2010-07-06 14:35:14

+1

如果'T'沒有合適的構造函數呢? – 2010-07-06 15:25:14

回答

7

您需要使用反射(newInstance()),因爲在編譯時其構造函數需要鏈接的類未知。所以編譯器不能生成鏈接。

1

也許,你看這個模式(從答案帶到另一個question):

private static class SomeContainer<E> 
{ 
    E createContents(Class<E> clazz) 
    { 
     return clazz.newInstance(); 
    } 
} 

在這裏,當我們創建一個SomeContainer,我們parametize的實例與具體類(如String) 。 createContents只接受String.classString.class.newInstance()將創建一個新的(空的)字符串。

0

如果您在編譯時知道類型,請使用「new Whatever()」。如果您在編譯時不知道該類型,但可以爲它獲取一個Class對象,請使用newInstance()。

99%的時間我知道類型,我用「新的Whatever()」。