2014-04-20 188 views
0

解釋我的問題:創建動態類型Java

我有一個名爲First的超級抽象類,然後我有很多從它繼承的類。 我想建立一個方法,我「說」它「創建一個從First類繼承的類型之一的ArrayList」,但我不能找到解決方案。 例如:

public abstract class First{ 

    public First(){ 
    } 
} 

public class FirstOne extends First{ 

    ........... 
} 

//It's a pseudo-code 
public class MyProgramClass{ 

    public creatingMethod(TypeThatInheritFromFirstClass x){ 
     return ArrayList<TypeThatInheritFromFirstClass>; 
    } 
} 

我插入creatingMethod程序類,但它可以在任何地方(我喜歡在頭等艙像靜態方法,但它是一個例子)

感謝您的時間

+0

您的用例是什麼? – qqilihq

+1

在運行時,'ArrayList'是'ArrayList'是'ArrayList'。 –

+0

我想自動化一個機制。我更好地解釋:在程序中,我有這個類繼承超級抽象類,當我創建它們時,我總是調用「activate」和「position」方法。使用幾行代碼自動執行此過程,我創建了variuos類型對象。我不知道我是否解釋得很好 – user3550545

回答

0

你可以使用一個type token

public class SomeGenerics { 
    public static void main(String[] args) { 
     List<SubFirst1> list1 = creatingMethod(SubFirst1.class); 
     List<SubFirst2> list2 = creatingMethod(SubFirst2.class); 
    } 
    public static <T extends First> List<T> creatingMethod(Class<T> type) { 
     return new ArrayList<>(); 
    } 
} 

class First {} 
class SubFirst1 extends First {} 
class SubFirst2 extends First {} 

編輯按照評論:

因爲你已經有類型令牌,你可以用它來創建該類型的實例。有一點限制,你必須知道使用什麼構造函數。如果它們 - 例如 - 都有一個無參數的構造函數,你可以像創建實例:

public static <T extends First> List<T> creatingMethod(Class<T> type) throws ReflectiveOperationException { 
    List<T> result = new ArrayList<>(); 
    result.add(type.newInstance()); 
    return result; 
} 

如果你有一個帶參數的構造函數(再次:所有子類必須具有相同的參數的構造函數),你必須去一個更困難的方法。字符串參數示例:

public static <T extends First> List<T> creatingMethod(Class<T> type, String param) throws ReflectiveOperationException { 
    List<T> result = new ArrayList<>(); 
    Constructor<T> constructor = type.getDeclaredConstructor(String.class); 
    result.add(constructor.newInstance(param)); 
    return result; 
} 
+0

是的,它與我想要的類似,但有一個問題。創建方法我必須調用輸入類型的構造函數,然後在ArrayList中添加創建的對象 – user3550545

+0

@ user3550545請參閱編輯 – Seelenvirtuose

+0

謝謝,但我不明白我如何使用第二個示例,我在構造函數中有四個參數。我怎麼做?再次感謝您 – user3550545