2013-04-30 69 views
1

我想實例化一個名爲「T」擴展「AbstractLauncher」的泛型類,我不明白我在谷歌上看到的所有主題。你可以幫幫我嗎 ? 我有幾個類中調用ConcretXLauncher,我不會對我的MainClass「ConcretXLauncher」,但只有仿製藥誰可能是任何延長AbstractLauncher ...如何做一個泛型類T的「新」擴展AbstractClass(JAVA)

public MainClass < T extends AbstractLauncher > { 

    public MainClass(Config config){ 
     //T launcher = new T(config); doesnt work, I want to do new ConcretXLauncher(config)  

     T launcher = newInstance(????); 
     // code using "launcher" 
    } 

    public static <T> T newInstance(Class clazz) { 
     return clazz.newInstance() ; 
    } 

} 

在其他的話題,我看到了這個功能,但我不知道該怎麼稱呼它? 我需要提供什麼「clazz」參數?

+0

我們甚至不知道你在說什麼語言...... – 2013-04-30 19:55:36

+0

你不能像這樣實例化一個泛型類。 '新T'不起作用。 – 2013-04-30 20:00:52

+0

創建通用類型的實例目前不可行,但您可以實現工廠模式。更多信息可以在這裏http://en.wikipedia.org/wiki/Factory_method_pattern,甚至更好這裏http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in​​-java。 – 2013-04-30 20:09:19

回答

0

下面是如何定義newInstance方法,並調用它的一個例子:

public class Test { 
    public static <T> T newInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException { 
    return clazz.newInstance(); 
    } 

    static class A { 

    @Override 
    public String toString() { 
     return "hello"; 
    } 
    } 

    public static void main(String[] args) throws InstantiationException, IllegalAccessException { 
    A a = newInstance(A.class); 
    System.out.println(a); 
    } 
} 
+0

你的A類代表什麼? 你的課是否測試我的「MainClass」? – 2013-04-30 21:10:41

0

您可以使用下面的

public class MainClass < T extends AbstractLauncher> { 

    public MainClass(Config config, Class<T> clazz) throws Exception { 


     T launcher = newInstance(clazz); 
     // code using "launcher" 
    } 

    public static <T> T newInstance(Class<T> clazz) throws Exception { 
     return clazz.newInstance() ; 
    } 

} 

你可以引入一個自定義的運行時異常而不是從拋出異常構造函數

相關問題