[英]Java - Creating an object extending List
如何創建具有指定類型參數的列表? 例如:
LinkedList<Integer> list = createList(LinkedList.class, Integer.class);
我已經嘗試為它創建一個方法,但該方法在創建新實例時不包含type參數。
public static <T, L extends List<T>> L createList(Class<L> listClazz, Class<T> valueClazz) throws Exception
{
return listClazz.getConstructor().newInstance();
//Instead of
// new L<T>();
//does
// new L();
}
我希望我的問題很清楚,謝謝你的幫助。
你不能這樣做。 泛型在運行時沒有業務,因此您無法使用反射在運行時創建參數化實例。 在運行時, LinkedList<Intege>
只是一個LinkedList
。 類型信息 - Integer
在編譯時通過“類型擦除”被擦除。 關鍵是,你為什么要這樣做?
//Instead of // new L<T>(); //does // new L();
這兩個“做”完全相同的事情。 你怎么知道它“做”而不是另一個? 類型參數是用於類型檢查的編譯時幻象。 它們與代碼“做”無關。 要創建LinkedList<T>
的實例,您不需要知道T
是什么,因為它在類型擦除后並不存在。
我認為你遇到的問題與函數內部的代碼無關,而是與方法的簽名有關。 通過這一事實,該方法被聲明為是,和要傳遞類型的表達式Class<LinkedList>
(類型LinkedList.class
)給它, L
必須是LinkedList
,並且由於該方法返回L
,編譯器必須考慮通過LinkedList
類型返回它。 這些都與方法內的代碼無關。
如果希望將方法的返回類型視為LinkedList<Integer>
,則只需傳入Class<LinkedList<Integer>>
類型的表達式。 簡單吧? 如何獲得Class<LinkedList<Integer>>
類型的表達式? 首先,你可以做(Class<LinkedList<Integer>>)(Class<?>)LinkedList.class
。
如果這看起來有點虛假,那是因為Class
基本上是一個運行時的東西 - 它允許運行時從該類創建一個對象。 將它與Generics(編譯時類型檢查機制)一起使用從根本上是有缺陷的。 任何類都只有一個類對象,例如LinkedList
。 是LinkedList
還是LinkedList<Integer>
或LinkedList<String>
? 好吧,它可能就是所有這些,在某種意義上, newInstance()
方法可以創建它們中的任何一個(在運行時沒有區別)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.