泛型数组

时间:2016-12-15 16:07:22

标签: java arrays algorithm generics junit

我试图了解泛型如何运作。我创建了几个实现排序算法,并在排序之前通过AbstractSorter.java中的 shuffleArray 方法对输入数组进行混洗:

public class AbstractSorter<T extends Comparable> {

public void swap(final T[] input, int srcPos, int dstPos) {
    if (dstPos != srcPos) {
        T accum = input[dstPos];
        input[dstPos] = input[srcPos];
        input[srcPos] = accum;

    }
}

public T[] shuffleArray(final T[] inputArray) {
    //        E[] arr = (E[])new Object[INITIAL_ARRAY_LENGTH];
    T[] result = (T[]) new Comparable[inputArray.length];
    System.arraycopy(inputArray, 0, result, 0, inputArray.length);
    int index;
    Random random = new Random();
    for (int i = result.length - 1; i > 0; i--) {
        index = random.nextInt(i + 1);
        if (index != i) {
            swap(result, i, index);
        }
    }
    return result;
}

public boolean more(final T x, final T y) {
    return (x.compareTo(y) > 0);
}

但是当我尝试使用这样的时候:

AbstractSorter<Integer> sortHelper = new AbstractSorter();
Integer[] expResult = new Integer[]{-30, -29, -28, -27 };
Integer[] shuffleArray = sortHelper.shuffleArray(expResult);
System.out.println("Array ="+Arrays.toString(shuffleArray));

我得到了例外:

java.lang.ClassCastException: 
[Ljava.lang.Comparable; cannot be cast to [Ljava.lang.Integer;

我不明白如何修复shuffle方法。是否可以在阵列上实现此功能,还是应该迁移到集合?

提前致谢!

3 个答案:

答案 0 :(得分:1)

您正在尝试创建Comparable数组,但预期数组是Integer的数组。

即使包含的对象是父对象,也无法将某个数组转换为其他数组。

但正如你所说,我们不能轻易创建一个通用对象数组,所以我指的是How to create a generic array in Java?

替换:

T[] result = (T[]) new Comparable[inputArray.length];

with:

final T t = inputArray[0];
T[] result = (T[]) Array.newInstance(t.getClass(), inputArray.length);

答案 1 :(得分:1)

您获得异常的原因是您尝试将Comparable个对象的数组转换为Integer个对象的数组,这是非法的。您只能从Integer投射到Comparable,而不是相反。

这是您的问题:T[] result = (T[]) new Comparable[inputArray.length];。在这种情况下,您要Comparable转换为T Integer

将行T[] result = (T[]) new Comparable[inputArray.length];System.arraycopy(inputArray, 0, result, 0, inputArray.length);更改为T[] result = Arrays.copyOf(inputArray, inputArray.length);,以便您的shuffleArray方法如下:

public T[] shuffleArray(final T[] inputArray) {
    T[] result = Arrays.copyOf(inputArray, inputArray.length);
    int index;
    Random random = new Random();
    for (int i = result.length - 1; i > 0; i--) {
        index = random.nextInt(i + 1);
        if (index != i) {
            swap(result, i, index);
        }
    }
    return result;
}

运行示例:

AbstractSorter<Integer> sortHelper = new AbstractSorter();
Integer[] expResult = new Integer[]{-30, -29, -28, -27};
Integer[] shuffleArray = sortHelper.shuffleArray(expResult);

System.out.println ("Array =" + Arrays.toString(shuffleArray));

产生结果:Array =[-30, -28, -29, -27]

答案 2 :(得分:0)

当然,您需要以下内容:

public class AbstractSorter<T extends Comparable<T>>

T[] result = (T[]) new Comparable<T>[inputArray.length];

AbstractSorter<Integer> sortHelper = new AbstractSorter<>();