java.lang.ClassCastException 使用泛型和 mergeSort

标签 java generics mergesort classcastexception comparable

我的代码中出现以下异常:

java.lang.ClassCastException: [Ljava.lang.Comparable; cannot be cast to [Ljava.lang.Integer; at the following method:

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);

这只适用于数组,如果你有一个列表,你将无法获取类型...

关于java.lang.ClassCastException 使用泛型和 mergeSort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632117/

相关文章:

Bash 通用 "ps aux"按严格名称处理

c - C 递归子程序中释放内存

arrays - 使用 typescript 计算数组中的反转

Java8 : Using an IntStream as a Supplier parameter for custom Collector

c# - 泛型确保 T 属于指定的 N 个类中的任何一个

java - 在 catch block 内抛出异常 - 它会再次被捕获吗?

java - 当项目排队到队列对象上时,队列对象保持为空

归并排序将序列不分成两半

java - 如何将日期 TextView 转换为 Long 以与当前日期进行比较

java - 对从 REST API 中过滤 JSON 对象的疑问