public class MergeSort
{
/**
* @param a Array to be sorted.
* @param n Last element to be sorted.
* @return void.
*/
public static <T extends Comparable<T>> void sort(T[] a, int n)
{
}
/**
* @param inp Input Array.
* @param out Output Array.
* @param first First index.
* @param mid Middle index.
* @param last Last index.
* @return void.
*/
private static <T extends Comparable<T>>
void merge(T[] inp, T[] out, int first, int mid, int last)
{
}
}
大家好,我需要一些帮助。
以上是我教授给我们的大纲。我的问题是我想在sort方法中创建一个T [] b数组,所以当我将它们传递给merge方法时,我可以重用两个数组'a'和'b'。我每次调用它时都不会在合并中创建临时数组。我试过了
T[] b = (T[]) new Object[n];
该类将编译,但是当我从主类中使用Integer数组调用sort方法时,我得到:
java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable;
我该怎么办? 如果我在任何地方都错过了这个答案,那么我的任何帮助都会得到很大的帮助。我一直在寻找这一天的大部分时间。谢谢!
答案 0 :(得分:4)
嗯,简短的回答是,在Java中,数组和泛型不能很好地协同工作。
正如您所知,Java泛型是使用类型擦除实现的,这意味着在编译时类型可能是<T extends Comparable<T>>[]
,在运行时类型被擦除到其下限,在本例中为{ {1}}(使用原始类型)。 Comparable[]
的类型 not 实际上已删除为T[]
,除非它实际上是通用约束的下限。
这样做的结果是可以安全地说:
Object[]
一切都应该如你所愿。
请注意,如果您尝试混合数组和泛型,实际上还有很多警告。例如,您可以通过使用通用通配符(例如@SuppressWarnings("unchecked")
T[] b = (T[]) new Comparable<?>[n];
和<? extends T>
)来实现协方差和协方差,但Java中的数组本身实现协方差(当您尝试使用时,只需抛出<? super T>
使其类型不变量无效)。因此,如果您能够从数组切换到泛型类型(例如,ArrayStoreException
可能会执行您想要的操作),那么您将发现事情变得更加顺利。
您可能还会发现这些链接很有用:
答案 1 :(得分:0)
由于Object
无法转换为T
T b = (T) new Object();
因此,这也不是真的
T[] b = (T[]) new Object[n];
您可以查看如何实施Collection.toArray(T[] a)
来创建类型为T
的新数组。