gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:05:04 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com