Java 使用array.newInstance()创建新的泛型类型数组

Java 使用array.newInstance()创建新的泛型类型数组,java,mergesort,Java,Mergesort,实际上,我正在尝试实现合并排序算法,但在尝试实例化泛型类型数组时遇到了相当快的问题。我不完全确定我的计划是否会成功,但现在有趣的部分(或令人沮丧的部分,取决于您何时问我)是merge()方法中的第二行。newInstance()方法需要知道它应该作为什么类启动,但即使arr1.getClass()编译得非常好,它也无法在运行时工作 public void mergeSort(T[] arr) { T[] merged = merge(Arrays.copyOfRange(arr, 0,

实际上,我正在尝试实现合并排序算法,但在尝试实例化泛型类型数组时遇到了相当快的问题。我不完全确定我的计划是否会成功,但现在有趣的部分(或令人沮丧的部分,取决于您何时问我)是merge()方法中的第二行。newInstance()方法需要知道它应该作为什么类启动,但即使arr1.getClass()编译得非常好,它也无法在运行时工作

public void mergeSort(T[] arr) {

    T[] merged = merge(Arrays.copyOfRange(arr, 0, arr.length/2), Arrays.copyOfRange(arr, arr.length/2+1, arr.length-1));

}

@SuppressWarnings({"unchecked"})
public T[] merge(T[] arr1, T[] arr2) {
    // A new array of type T that will contain a merged version of arr1 and arr2
    T[] merged = (T[]) Array.newInstance(arr1.getClass(), arr1.length+arr2.length);

    int i1 = 0, i2 = 0;
    for (int i = 0; i < arr1.length + arr2.length; i++) {
        if (arr1[i1].compareTo(arr2[i2]) < 0) {
            merged[i] = arr1[i1];
            i1++;
        } else {
            merged[i] = arr2[i2];
            i2++;
        }
    }

    return merged;
}

我想我看到了问题。。。当您执行
Array.newInstance(…)
时,它接受组件类型(在您的示例中,您希望它是字符串)。但是,您正在处理数组类(arr1的类型为String[],您正在执行
arr1.getClass()
)。相反,你应该这样做

arr1.getClass().getComponentType()
String[]

Per:

静态对象newInstance(类componentType,int[]维)
componentType—表示新数组的组件类型的类对象


我复制并粘贴了您提供的代码,但它甚至没有编译。在进行了一些修复后,我得出了以下结论:

public class Test {

  public <T extends Comparable> void mergeSort(T[] arr) {
    T[] merged = merge(Arrays.copyOfRange(arr, 0, arr.length / 2), Arrays.copyOfRange(arr, arr.length / 2 + 1, arr.length - 1));
  }

  public <T extends Comparable> T[] merge(T[] arr1, T[] arr2) {
    // A new array of type T that will contain a merged version of arr1 and arr2
    T[] merged = (T[]) Array.newInstance(arr1.getClass(), arr1.length + arr2.length);

    int i1 = 0, i2 = 0;
    for(int i = 0; i < arr1.length + arr2.length; i++) {
      if(arr1[i1].compareTo(arr2[i2]) < 0) {
        merged[i] = arr1[i1];
        i1++;
      } else {
        merged[i] = arr2[i2];
        i2++;
      }
    }
    return merged;
  }
}
公共类测试{
公共无效合并排序(T[]arr){
T[]merged=merge(Arrays.copyOfRange(arr,0,arr.length/2),Arrays.copyOfRange(arr,arr.length/2+1,arr.length-1));
}
公共T[]合并(T[]arr1,T[]arr2){
//类型为T的新数组将包含arr1和arr2的合并版本
T[]合并=(T[])Array.newInstance(arr1.getClass(),arr1.length+arr2.length);
inti1=0,i2=0;
对于(int i=0;i

由于您使用的是
compareTo
方法,因此必须告诉编译器
T
实现此接口

是的,我在类声明中使用了
implements
 static Object newInstance(Class<?> componentType, int[] dimensions) 
public class Test {

  public <T extends Comparable> void mergeSort(T[] arr) {
    T[] merged = merge(Arrays.copyOfRange(arr, 0, arr.length / 2), Arrays.copyOfRange(arr, arr.length / 2 + 1, arr.length - 1));
  }

  public <T extends Comparable> T[] merge(T[] arr1, T[] arr2) {
    // A new array of type T that will contain a merged version of arr1 and arr2
    T[] merged = (T[]) Array.newInstance(arr1.getClass(), arr1.length + arr2.length);

    int i1 = 0, i2 = 0;
    for(int i = 0; i < arr1.length + arr2.length; i++) {
      if(arr1[i1].compareTo(arr2[i2]) < 0) {
        merged[i] = arr1[i1];
        i1++;
      } else {
        merged[i] = arr2[i2];
        i2++;
      }
    }
    return merged;
  }
}