如果您得到一个运行时异常,这意味着您尝试投射的对象不会实际使用该类型。语言与它没有任何关系。您的代码中可能存在一个错误。
编辑:听起来好像你对Java的类型系统的工作方式感到困惑。在C#中,泛型实际上在运行时表示不同的类型。在Java中,泛型类型在运行时不存在。它们只是一个方便,可以更好地编译时间类型检查。在编译过程中,泛型在被称为类型擦除的过程中被实际类型所取代。
通常,删除一个通用类型为Object
,但由于您提供了T
的上限,因此将其转换为该绑定的Comparable
。因此,擦除后,你的代码看起来像这样。
Comparable[] aux = (Comparable[]) new Object[xs.length];
。换句话说,你要创建Object[]
类型的数组,并立即试图将它转换为类型Comparable[]
。由于Object
没有实现Comparable
,这些类型是不兼容的,所以你得到一个运行时异常。您可以通过创建一个Comparable
的数组来解决此问题。
public static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
T[] aux = (T[]) new Comparable[xs.length];
mergeSort(xs, aux, 0, xs.length);
}
我想你应该看到http://stackoverflow.com/questions/1817524/generic-arrays-in-java 这是相当有趣的。 –