繁体   English   中英

类从比较类型转换为整数类型的异常

[英]Class Cast Exception from Comparable to Integer type

我正在尝试实现通用的MergeSort排序算法。 该函数仅接受实现Comparable接口的类型,并且display函数采用任何类型的数组来显示该数组的内容。 但我收到此例外-

Exception in thread "main" java.lang.ClassCastException: java.base/[Ljava.lang.Comparable; cannot be cast to java.base/[Ljava.lang.Integer;

在mergeSort.MergeSort.main(MergeSort.java:10)

我的代码如下:

package mergeSort;

import java.util.Arrays;

public class MergeSort
{
    public static void main(String[] args)
    {
        Integer[] array = new Integer[]{3, 4, 2, 9, 5, 7, 8, 1, 6};
        display(mergeSort(array));
    }

    public static <T extends Comparable<T>> T[] mergeSort(T[] array)
    {
        if(array.length <= 1) return array;

        int leftLength = array.length/2;
        int rightLength = array.length - leftLength;

        T[] left = (T[]) new Comparable[leftLength];
        T[] right = (T[]) new Comparable[rightLength];

        for(int i = 0; i < array.length; i++)
        {
            if(i < leftLength)
            {
                left[i] = array[i];
            }
            else
            {
                right[Math.abs(left.length-i)] = array[i];
            }
        }

        return merge(mergeSort(left), mergeSort(right));
    }

    public static <T extends Comparable<T>> T[] merge(T[] left, T[] right)
    {
        T[] merged = (T[]) new Comparable[left.length + right.length];

        int i = 0;
        int j = 0;
        int k = 0;

        while(i < left.length && j < right.length)
        {
            if(left[i].compareTo(right[j]) < 0)
            {
                merged[k++] = left[i++];
            }
            else
            {
                merged[k++] = right[j++];
            }
        }

        while(i < left.length) merged[k++] = left[i++];
        while(j < right.length) merged[k++] = right[j++];

        return merged;
    }

    public static <T> void display(T[] array)
    {
        Arrays.stream(array).forEach(value -> System.out.print(value + " "));
        System.out.println();
    }
}

该方法声明承诺了它不会做的事情:

public static <T extends Comparable<T>> T[] mergeSort(T[] array)

您没有返回T[] 您将返回Comparable[] 因此,可以这样声明:

public static Comparable<?>[] mergeSort(Comparable<?>[] array) { ... }
public static Comparable<?>[] merge(Comparable<?>[] left, Comparable<?>[] right) { ... }

或者,使用Array.newInstance()创建数组。 例如:

public static <T extends Comparable<T>> T[] merge(T[] left, T[] right) {
    T[] merged = (T[]) Array.newInstance(
        left.getClass().getComponentType(), 
        left.length + right.length);
    ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM