我有一行代碼在下面。ArrayList是一種原始類型。引用泛型ArrayList <E>應參數化修復引起的錯誤
List<? extends SortKey> sortKeys = new ArrayList();
這引起了警告ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized
。我做了一些研究,發現這些問題 - Collections of generics 「Cannot instantiate the type ArrayList」和How can elements be added to a wildcard generic collection?。所以我構建了一個public List
,看起來像下面這樣。
public <T extends SortKey> List<T> sortKeys() {
List<SortKey> keys = new ArrayList<SortKey>();
keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING));
keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING));
return keys;
}
但是,當我嘗試編譯此代碼時,出現錯誤Type mismatch: cannot convert from List<RowSorter.SortKey> to List<T>
。我該如何解決這個錯誤?
注
我還發現了該代碼,List<? extends SortKey> sortKeys = new ArrayList<>();
行,消除了警告,但我不明白爲什麼?如果有人花時間來解釋或引用一些能讓我理解的東西,我將不勝感激。
編輯
使用下面的代碼修正錯誤。
public <T extends SortKey> List<T> sortKeys() {
List<T> keys = new ArrayList<T>();
keys.add((T) new RowSorter.SortKey(0, SortOrder.ASCENDING));
keys.add((T) new RowSorter.SortKey(1, SortOrder.ASCENDING));
return keys;
}
但是,產生新的警告,其狀態爲Type safety: Unchecked cast from RowSorter.SortKey to T
。
'T擴展SortKey'告訴編譯器類型必須從'SortKey'(是一個子類型)派生,而不是實際上是'SortKey'。由於你的函數返回'List',所以你不能返回'List '。既然你正在返回'keys'(這是一個'List '),你會收到一個錯誤。 –
至於'List <?擴展SortKey> sortKeys = new ArrayList()'給出錯誤,這是因爲你從不指定類型參數,這使得它是原始的(與ArrayList
爲什麼你的方法是通用的?你爲什麼不返回一個'List''? –