我在为在线算法类(class)做作业时遇到了问题。将 Object[]
转换为 T[]
,其中 T 是 Comparable 会引发运行时异常
public static <T extends Comparable<? super T>> void mergeSort(T[] xs) {
T[] aux = (T[]) new Object[xs.length];
mergeSort(xs, aux, 0, xs.length);
}
我可以用 C# 重写它,这在创建泛型数组方面没有任何问题,但我宁愿学习如何在 Java 中处理它。
最佳答案
如果您遇到运行时异常,则意味着您尝试转换的对象实际上并不具有该类型。语言与它没有任何关系。您的代码中可能存在错误。
编辑:听起来您对 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);
}
关于java - 将对象数组转换为可比较的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981319/