簡體   English   中英

Java - 創建擴展List的對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM