你可以使用一個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;
}
您的用例是什麼? – qqilihq
在運行時,'ArrayList'是'ArrayList'是'ArrayList'。 –
我想自動化一個機制。我更好地解釋:在程序中,我有這個類繼承超級抽象類,當我創建它們時,我總是調用「activate」和「position」方法。使用幾行代碼自動執行此過程,我創建了variuos類型對象。我不知道我是否解釋得很好 – user3550545