簡體   English   中英

java.lang.ClassCastException與genericSort一起使用泛型

[英]java.lang.ClassCastException using generics with mergeSort

我的代碼中出現以下異常:

java.lang.ClassCastException:[Ljava.lang.Comparable; 無法轉換為[Ljava.lang.Integer; 使用以下方法:

public static void comprobar() {
    Integer a1[] = crearAleatorioInteger(100000);
    Integer a2[] = Arrays.copyOf(a1, a1.length);
    Ordenacion.quickSort(a1);
    a2 = Ordenacion.mergeSort2(a2); //Here is where the exception is thrown
    if(Ordenacion.sonIguales(a1,a2)) System.out.println("Bien");
    else System.out.println("Mal");
}

我猜這個錯誤一定是在Ordenacion類中的mergeSort2()方法中,它是以下內容:

public static <T extends Comparable<T>> T[] mergeSort2(T[] v) {
    return mergeSort2(v, 0, v.length - 1);
}
private static <T extends Comparable<T>> T[] mergeSort2(T[] v, int i, int f){
    if (f - i <= 1) {
        T[] res = (T[]) new Comparable[f-i+1];
        if(f==i) res[0] = v[i];
        else if (v[i].compareTo(v[f]) > 0){
            res[0] = v[f];
            res[1] = v[i];
        }
        else{
            res[0] = v[f];
            res[1] = v[i];
        }
        return res;
    }
    else{
        int m = (i + f) / 2;
        return merge2(mergeSort2(v, i, m),mergeSort2(v, m + 1, f));
    }
}
private static <T extends Comparable<T>> T[] merge2(T[] v1, T[] v2){
    int a = 0, b = 0, k = 0;
    T[] res = (T[]) new Comparable[v1.length+v2.length];
    while(a < v1.length && b < v2.length){
        if (v1[a].compareTo(v2[b]) < 0) res[k++] = v1[a++];
        else res[k++] = v2[b++];
    }
    while (a < v1.length) res[k++] = v1[a++];
    while (b < v2.length) res[k++] = v2[b++];
    return res;
}

感謝您提供的任何幫助

您正在創建錯誤的數組類型,並將其轉換為“ T []”。

T[] res = (T[]) new Comparable[f-i+1];

您需要創建一個不是很簡單的T類型的數組。

由於無法在運行時查找泛型類型變量的實際類型,因此您可能必須執行以下操作...

public static <T extends Comparable<T>> T[] mergeSort2(T[] v, Class<T> type) {
    return mergeSort2(v, 0, v.length - 1, type);
}

private static <T extends Comparable<T>> T[] mergeSort2(T[] v, int i, int f, Class<T> type){
    if (f - i <= 1) {
        T[] res = (T[]) Array.newInstance(type, f-i+1);
        ...

更新:

正如@pbabcdefp指出的那樣,您無需傳遞“ Class”參數。 您可以改用此...

        T[] res = (T[]) Array.newInstance(v.getClass().getComponentType(), f-i+1);

這僅適用於數組,如果您具有列表,則將無法獲取類型...

您在此處創建一個Comparable數組:

T[] res = (T[]) new Comparable[f-i+1];

並嘗試將其轉換為Integer[] 這顯然是錯誤的,因為Comparable不是Integer子類,因此無法執行強制轉換。 您必須創建一個新的T類型數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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