在Java

时间:2015-12-27 22:32:27

标签: java arrays generics

我在尝试创建通用数组时得到了Cannot create a generic array of T 像这样

tmp = new T[n];

我找到了this 主题,但每次我想调用方法时必须通过类似乎对我来说很麻烦。

所以我以下一个方式解决了它

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

修改 也许更好的问题是;如果我使用下面的代码行呢?

this.tmp=(T[]) Arrays.copyOf(new Object[]{}, n)

1 个答案:

答案 0 :(得分:2)

您可以在guava中使用此方法

  static <T> T[] newArray(T[] reference, int length) {
    Class<?> type = reference.getClass().getComponentType();
    @SuppressWarnings("unchecked")
    T[] result = (T[]) Array.newInstance(type, length);
    return result;
  }