java将对象转换为可比较的运行时错误
我正在尝试用Java为BinarySearchTree编写代码。当我试图通过实例化一个整数BST对其进行测试时,我不断收到一个运行时错误。以下是相关代码:
public class BinarySearchTree<E extends Comparable<E>> {
private E[] nodes;
@SuppressWarnings("unchecked")
public BinarySearchTree() {
nodes = (E[])new Object[10];
}
}
现在,我主要有以下几行:
BinarySearchTree<Integer> test = new BinarySearchTree<Integer>();
运行代码时,我将此错误链接到构造函数的第一行:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
我不太熟悉泛型,但我猜这是因为对象没有定义compareTo方法?如果这一行行不通,我还有什么其他选择,这样我就可以拥有一个数组,以某种方式保存泛型可比类型
# 1 楼答案
出现此异常是因为数组的运行时类是[Object(如代码“new Object[10]”)。由于对象是所有其他类型的超类,因此不能将对象数组强制转换为任何其他类型的数组
一,。无法将A-Type-Array强制转换为B-Type-Array,除非A是B'子类
2.事件将子类型数组强制转换为超级类型数组,该数组仍然只存储子类型元素,因为运行时类型仍然是[Sub-Type]
您可以尝试使用以下代码:
根据您的情况,我认为您应该如下所示:
# 2 楼答案
当我们在泛型类中应用约束时,java编译器会将所有泛型参数替换为我们提供的约束
class Generic<T> { }
在本例中,java编译器生成字节码,将所有T类型替换为对象类李>class Generic<T extends Number> { }
这里它在内部用Number类替换T李>您使用Comparable接口作为约束,因此在内部它将所有T替换为Comparable,这就是为什么您不能将对象类型强制转换为Comparable 要解决这个问题,可以使用
(T[]) new Comparable[50];
# 3 楼答案
对
E[]
的擦除是Comparable[]
(因为E
的上界是Comparable<E>
),所以在运行时,它将强制转换为Comparable[]
,这会失败,因为对象的实际运行时类型是Object[]
。您可以通过创建Comparable[]
来解决此问题: