Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java创建泛型数组_Java_Arrays_Generics - Fatal编程技术网

用Java创建泛型数组

用Java创建泛型数组,java,arrays,generics,Java,Arrays,Generics,在尝试创建泛型数组时,我发现无法创建T的泛型数组 像这样 tmp = new T[n]; 我发现 但每次我想调用这个方法时都要通过考试,这似乎给我带来了很多麻烦 所以我用下一种方法解决了它 this.tmp=Arrays.copyOf(list, n); 考虑到代码的其余部分,这是一个好的解决方案吗?为什么是?为什么不 完整代码: public class MergeSort<T extends Comparable<? super T>>{ private

在尝试创建泛型数组时,我发现
无法创建T的泛型数组
像这样

tmp = new T[n];
我发现 但每次我想调用这个方法时都要通过考试,这似乎给我带来了很多麻烦

所以我用下一种方法解决了它

this.tmp=Arrays.copyOf(list, n);
考虑到代码的其余部分,这是一个好的解决方案吗?为什么是?为什么不

完整代码:

public class MergeSort<T extends Comparable<? super T>>{
    private T[] A;
    private T[] tmp;
    private int n;

    public void sort(T[] list){
        this.A=list;
        this.n=list.length;
        this.tmp=Arrays.copyOf(list, n);
        mergeSort(0,n-1);
    }

    private void mergeSort(int low,int high){
        if(low<high){
            int middle=(low+high)/2;
            mergeSort(low, middle);
            mergeSort(middle+1, high);
            merge(low,middle,high);
        }
    }
    private void merge(int left,int right,int rightEnd){
        int leftEnd=right,k=left;
        right++;
        while(left<=leftEnd && right<=rightEnd){
            if(A[left].compareTo(A[right])<=0)
                tmp[k++]=A[left++];
            else
                tmp[k++]=A[right++];
        }

        while(left<=leftEnd)
            tmp[k++]=A[left++];
        while(right<=rightEnd)
            tmp[k++]=A[right++];

        for (int i = 0; i <= rightEnd; i++) {
              A[i] = tmp[i];
        }
    }
}

你可以用番石榴的这种方法

  static <T> T[] newArray(T[] reference, int length) {
    Class<?> type = reference.getClass().getComponentType();
    @SuppressWarnings("unchecked")
    T[] result = (T[]) Array.newInstance(type, length);
    return result;
  }
static T[]newArray(T[]reference,int-length){
类类型=reference.getClass().getComponentType();
@抑制警告(“未选中”)
T[]结果=(T[])数组.newInstance(类型,长度);
返回结果;
}

您需要以合并排序方式复制源数组:)顺便说一句,您的合并排序已被破坏@Sleiman感谢您指出错误。至于复制,是的,在这里我需要复制数组,但这就是我开始考虑如何创建通用数组的地方。也许更好的问题是,是否像这样“this.tmp=(T[])Arrays.copyOf(newobject[]{},n);”在Java中,每个数组都有一个公共的
clone()
方法。您只需编写
this.tmp=list.clone()。我将使用此方法,因为它似乎是一个更好的解决方案,但我不能将其标记为答案,谢谢。
  static <T> T[] newArray(T[] reference, int length) {
    Class<?> type = reference.getClass().getComponentType();
    @SuppressWarnings("unchecked")
    T[] result = (T[]) Array.newInstance(type, length);
    return result;
  }