Java泛型合并排序,线程中的异常;“主要”;java.lang.ClassCastException错误

Java泛型合并排序,线程中的异常;“主要”;java.lang.ClassCastException错误,java,generics,mergesort,Java,Generics,Mergesort,我使用java泛型为MergeSort编写了一个java程序。然而,我得到以下错误,我不明白我哪里出了错。请帮帮我 线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为[Ljava.lang.Compariable; 位于src.MergeSort.sort(MergeSort.java:9) 位于src.MergeSort.main(MergeSort.java:57) 包src; 导入java.util.array

我使用java泛型为MergeSort编写了一个java程序。然而,我得到以下错误,我不明白我哪里出了错。请帮帮我

线程“main”java.lang.ClassCastException中的异常:[Ljava.lang.Object;无法转换为[Ljava.lang.Compariable; 位于src.MergeSort.sort(MergeSort.java:9) 位于src.MergeSort.main(MergeSort.java:57)

包src; 导入java.util.array

public class MergeSort {

  // sort array of type T using the Mergesort algorithm
  public static <T extends Comparable<T>> T[] sort(T[] arr) {
  if (arr.length > 1){
      T[] firstHalf =  (T[]) new Object[arr.length/2];
      System.arraycopy(arr, 0, firstHalf, 0, arr.length /2);
      sort(firstHalf);

 int secondHalfLength = arr.length -arr.length/2;
 T[] secondHalf = (T[]) new Object[secondHalfLength];
 System.arraycopy(arr, arr.length/2, secondHalf, 0, secondHalfLength);
 sort(secondHalf);
 merge(firstHalf, secondHalf, arr);

  }


      return arr;
  }

  public static <T extends Comparable<T>> void merge(T[] arr1, T[] arr2, T[] temp) {
  int current1 = 0;
  int current2 = 0;
  int current3 = 0;

  while(current1 < arr1.length && current2 < arr2.length){
      if (arr1[current1].compareTo(arr2[current2]) < 0)
          temp[current3++] = arr1[current1++];
      else
          temp[current3++] = arr2[current2++];

          }

  while (current1 < arr1.length)
  temp[current3++] = arr1[current1++];
  while (current2 < arr2.length)
  temp[current3++] = arr2[current2++];


  }




  public static void main(String[] args) {



// sort list of Characters
Character[] charArr = {'H','e','l','l','o',' ','w','o','r','l','d','!'};

charArr = MergeSort.<Character>sort(charArr);
System.out.println(Arrays.toString(charArr));

// sort list of Integers
Integer[] intArr = {23,4,15,8,42,16};

intArr = MergeSort.<Integer>sort(intArr);
System.out.println(Arrays.toString(intArr));
      }
    }
公共类合并排序{
//使用Mergesort算法对T类型的数组进行排序
公共静态T[]排序(T[]arr){
如果(arr.length>1){
T[]上半部分=(T[])新对象[arr.length/2];
系统阵列复制(arr,0,上半部分,0,arr.length/2);
排序(上半部分);
int secondhallength=arr.length-arr.length/2;
T[]secondHalf=(T[])新对象[secondHalf长度];
系统阵列复制(arr,arr.length/2,secondHalf,0,secondHalf length);
排序(后半部分);
合并(上半部分、下半部分、arr);
}
返回arr;
}
公共静态无效合并(T[]arr1,T[]arr2,T[]temp){
int current1=0;
int current2=0;
int current3=0;
while(current1
长话短说,这是因为您的类型参数实际上正在被擦除为
可比的

请记住,泛型将被擦除为其边界类型。在大多数情况下,如果没有边界类型,类型参数将被擦除为
对象
,但在这里,因为您是通过
可比
来绑定
T
T
将被擦除为
可比
。因此,强制转换如下:

T[] firstHalf =  (T[]) new Object[arr.length/2];
变成

Comparable[] firstHalf = (Comparable[]) new Object[arr.length / 2];
由于
对象
未实现
可比
,因此转换在运行时失败


解决方案?只需将数组设置为可比较[]。这样,您的强制转换在运行时不会失败。

长话短说,这是因为您的类型参数实际上被擦除为可比较的

请记住,泛型将被擦除为其边界类型。在大多数情况下,如果没有边界类型,类型参数将被擦除为
对象
,但在这里,因为您是通过
可比
来绑定
T
T
将被擦除为
可比
。因此,强制转换如下:

T[] firstHalf =  (T[]) new Object[arr.length/2];
变成

Comparable[] firstHalf = (Comparable[]) new Object[arr.length / 2];
由于
对象
未实现
可比
,因此转换在运行时失败


解决方案?只需将数组设置为可比较[]。这样,您的强制转换在运行时不会失败。

长话短说,这是因为您的类型参数实际上被擦除为可比较的

请记住,泛型将被擦除为其边界类型。在大多数情况下,如果没有边界类型,类型参数将被擦除为
对象
,但在这里,因为您是通过
可比
来绑定
T
T
将被擦除为
可比
。因此,强制转换如下:

T[] firstHalf =  (T[]) new Object[arr.length/2];
变成

Comparable[] firstHalf = (Comparable[]) new Object[arr.length / 2];
由于
对象
未实现
可比
,因此转换在运行时失败


解决方案?只需将数组设置为可比较[]。这样,您的强制转换在运行时不会失败。

长话短说,这是因为您的类型参数实际上被擦除为可比较的

请记住,泛型将被擦除为其边界类型。在大多数情况下,如果没有边界类型,类型参数将被擦除为
对象
,但在这里,因为您是通过
可比
来绑定
T
T
将被擦除为
可比
。因此,强制转换如下:

T[] firstHalf =  (T[]) new Object[arr.length/2];
变成

Comparable[] firstHalf = (Comparable[]) new Object[arr.length / 2];
由于
对象
未实现
可比
,因此转换在运行时失败



解决方案?只需将数组
设置为可比较[]
。这样您的强制转换在运行时就不会失败。

为什么要实例化
对象[]
?在
数组中有一个
对象
,它没有实现
可比较的
接口,因为我无法使用t[]firstHalf=new t创建新的泛型数组[arr.length/2];那么如何为firstHalf创建新的泛型数组为什么要实例化
对象[]
?在
数组中有一个
对象
,它没有实现
可比的
接口,因为我无法使用t[/firstHalf=new t[arr.length/2]创建新的泛型数组;那么如何为firstHalf创建新的泛型数组为什么要实例化
对象[]
?在
数组中有一个
对象
,它没有实现
可比的
接口,因为我无法使用t[]firstHalf=new t[arr.length/2]创建新的泛型数组;那么如何为firstHalf创建新的泛型数组为什么要实例化
对象[]
?在
数组中有一个
对象
,它没有实现
可比的
接口,因为我无法使用t[]firstHalf=new t[arr.length/2]创建新的泛型数组;那么我如何为firstHalf创建新的泛型数组谢谢。我使用了T[]firstHalf=(T[])new compariable[arr.length/2];而不是T[]firstHalf=(T[])new Object[arr.length/2];它工作了,但是我得到了“类型安全:未检查的强制转换”