我试图了解泛型的工作原理。我创建了几种实现方式的排序算法,并在通过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;
我不明白如何解决随机播放方法。是否可以在阵列上实现此功能,还是应该迁移到集合?
提前致谢!
最佳答案
得到异常的原因是因为您试图将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]