【问题标题】:Java Generics MergeSort, exception in thread "main" java.lang.ClassCastException errorJava Generics MergeSort,线程“main”中的异常 java.lang.ClassCastException 错误
【发布时间】:2014-05-22 09:18:34
【问题描述】:

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

线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object;不能转换为 [Ljava.lang.Comparable; 在 src.MergeSort.sort(MergeSort.java:9) 在 src.MergeSort.main(MergeSort.java:57)

包源代码; 导入 java.util.Arrays;

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

【问题讨论】:

  • 你为什么要实例化Object[]
  • 您的Array 中有一个object 没有实现comparable 接口
  • 因为我无法使用 T[] firstHalf = new T[arr.length/2]; 创建新的泛型数组
  • 那么如何为 firstHalf 创建新的泛型数组

标签: java generics mergesort


【解决方案1】:

长话短说,这是因为您的类型参数实际上被删除为Comparable

记住,泛型被删除到它们的边界类型。在大多数情况下,没有边界类型,类型参数将被删除为Object,但在这里,因为您将TComparable 绑定,T 被删除为Comparable。因此,像这样的演员表:

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

成为

Comparable[] firstHalf = (Comparable[]) new Object[arr.length / 2];

而且因为Object 没有实现Comparable,所以转换在运行时会失败。

解决方案?只需让您的阵列Comparable[]。这样你的演员就不会在运行时失败。

【讨论】:

  • 谢谢。我用 T[] firstHalf = (T[]) new Comparable [arr.length/2];而不是 T[] firstHalf = (T[]) new Object[arr.length/2];它奏效了
  • 但是我得到“类型安全:从 Comparable[] 到 T[] 的未经检查的强制转换”你知道这是什么意思,或者我该如何避免它。谢谢
  • @user3612693 不幸的是,这是泛型在 Java 中实现的副产品。这意味着编译器无法证明强制转换不会在运行时抛出ClassCastException。如果你正确地实现了你的泛型,你应该能够向自己证明演员总是安全的,所以你可以在作业上贴上@SuppressWarnings("unchecked")。如果你看一下 Java 的 Collections 框架,你会发现那里使用了相同的方法。
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多