簡體   English   中英

Java /泛型/ ClassCastException

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

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