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 方法中创建 a, T[] b 数组,这样当我将它们传递给 merge 方法时我可以重用这两个数组 'a' 和 'b' 。我每次调用它时都没有在合并中创建一个临时数组。我试过了
T[] b = (T[]) new Object[n];
该类将编译,但是当我使用整数数组从主类调用 sort 方法时,我得到:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
我能做什么? 任何帮助将不胜感激,如果我在任何地方错过了这个答案,我深表歉意。我一直在寻找一天的大部分时间。谢谢!
最佳答案
嗯,简短的回答是,在 Java 中,数组和泛型不能很好地协同工作。
如您所知,Java 泛型是使用类型删除实现的,这意味着在编译时类型可能是 <T extends Comparable<T>>[]
,在运行时类型被删除到其下限,在本例中为 Comparable[]
(使用原始类型)。 T[]
的类型没有实际上被删除到Object[]
除非那实际上是通用约束的下限。
这样做的结果是可以安全地说:
@SuppressWarnings("unchecked")
T[] b = (T[]) new Comparable<?>[n];
一切都应该如您所愿。
请注意,如果您尝试混合使用数组和泛型,实际上还有很多注意事项需要注意。例如,您可以通过使用泛型通配符(例如 <? extends T>
和 <? super T>
)来实现泛型的协变和逆变,但 Java 中的数组本身实现协变(当您尝试使它们的类型不变量无效时,只抛出 ArrayStoreException
)。因此,如果您能够从数组切换到泛型类型(例如 ArrayList<T>
可能会做您想要的),那么您会发现事情进展得更顺利。
您可能还会发现这些链接很有用:
关于java - : T[] b = (T[]) new Object[n]; 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5575976/