[英]Java / Generics / ClassCastException
我有一個LinkedList<T>
,其中包含Object toArray()
方法:
public Object[] toArray()
{
Object[] array = new Object[size];
int c=0;
for(Node<T> i = first;i != null;i=i.next)
{
array[c++] = i.data;
}
return array;
}
我想用一個通用方法對我的LinkedList進行排序: <T extends Comparable> void sort (List<T> list)
。 要對列表進行排序,我必須在此方法中將它們表示為數組:
T[] elements = (T[])list.toArray();`
但是,我在這一行得到ClassCastException
,我不知道為什么。 由於方法的泛型類型等同於返回數組中元素的運行時類型,因此此轉換不是一個謊言!
toArray()
返回Object[]
。 類型信息丟失,您不能將其強制回T []。 如果要保留類型信息,可以使用以下內容。 然后給該方法一個預定義的數組,該數組將被填充。 如果您什么都不給toArray
將創建一個新的Object[]
。
T[] elements = list.toArray(new T[list.size()]);
只是填充數組(另一種寫作風格):
T[] elements = new T[list.size()];
list.toArray(elements);
或者,如果您使用Java 8:
T[] elements = list.stream().toArray(T[]::new);
方法LinkedList.toArray()
創建一個類型為Object[]
的新數組。 它不會創建類型為T[]
的新數組。 這很重要,因為即使數組僅包含T
實例,也無法將數組分配給類型為T[]
的變量,因為數組本身的類型為Object[]
。 您可以使用以下代碼重現此錯誤:
String[] array = (String[]) new Object[0];
如果我對您的理解正確,則希望將列表轉換為數組,以便能夠實現自己的搜索功能。 給定一個List<T>
,其中包含類型T
元素,您想將此列表轉換為類型T[]
的數組。 但是,您不能簡單地調用new T[list.size()]
,因為Java在編譯時會釋放泛型類型信息。 要創建正確類型的數組,您需要使用反射方法Array.newInstance()
。
這是一個例子:
@SuppressWarnings("unchecked")
private <T extends Comparable<T>> void sort(List<T> list, Class<T> clazz) {
T[] array = list.toArray((T[]) Array.newInstance(clazz, list.size()));
// sort array and write result to the list
}
這是用法:
List<String> list = new LinkedList<String>();
// populate the list
sort(list, String.class);
System.out.println(list); // -> the sorted list
您應該改用T[] toArray(new T[list.size()])
。 無需投放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.