java - 将对象数组转换为可比较的数组

标签 java

我在为在线算法类(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/

相关文章:

Java 公共(public)变量问题

java - 将 Jetty 线程池的一部分专用于特定端点

java - 我如何在 JMockit 中模拟具有通用对象的方法?

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Table 'bus' already exists

java.lang.ClassNotFoundException :com. mysql.jdbc.Driver 异常

java - 使用 SPARK 从 ftp 读取文件时出现异常

java - 如何在 Processing 中点对点画线

java - jersey/Mockito : NullInsteadOfMockException on client. 通话后验证

java - 用一组要求的点进行距离计算

java - 从 Java SE 程序调用 Web 服务方法