有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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方法?如果这一行行不通,我还有什么其他选择,这样我就可以拥有一个数组,以某种方式保存泛型可比类型


共 (3) 个答案

  1. # 1 楼答案

    出现此异常是因为数组的运行时类是[Object(如代码“new Object[10]”)。由于对象是所有其他类型的超类,因此不能将对象数组强制转换为任何其他类型的数组

    一,。无法将A-Type-Array强制转换为B-Type-Array,除非A是B'子类
    2.事件将子类型数组强制转换为超级类型数组,该数组仍然只存储子类型元素,因为运行时类型仍然是[Sub-Type]

    您可以尝试使用以下代码:

    public static void main(String[] args) {
        Object[] arr = new Object[10];
        Integer[] irr = (Integer[]) arr;// error: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
    }
    
    public static void main(String[] args) {
        Integer[] irr = new Integer[10];
        Object[] arr = irr; 
        arr[0] = new Object(); // java.lang.ArrayStoreException: java.lang.Object
    }
    

    根据您的情况,我认为您应该如下所示:

    class BinarySearchTree<E extends Comparable<E>> {
    private Comparable<E>[] nodes;
    
    @SuppressWarnings("unchecked")
    public BinarySearchTree() {
            nodes = new Comparable[10];
    }
    
    public void add(E e, int index){
        nodes[index] = e;
    }
    
    @SuppressWarnings("unchecked")
    public E get(int index){
        return (E)nodes[index];
    }
    }
    
  2. # 2 楼答案

    当我们在泛型类中应用约束时,java编译器会将所有泛型参数替换为我们提供的约束

    1. class Generic<T> { }在本例中,java编译器生成字节码,将所有T类型替换为对象类
    2. class Generic<T extends Number> { }这里它在内部用Number类替换T

    您使用Comparable接口作为约束,因此在内部它将所有T替换为Comparable,这就是为什么您不能将对象类型强制转换为Comparable 要解决这个问题,可以使用(T[]) new Comparable[50];

  3. # 3 楼答案

    E[]的擦除是Comparable[](因为E的上界是Comparable<E>),所以在运行时,它将强制转换为Comparable[],这会失败,因为对象的实际运行时类型是Object[]。您可以通过创建Comparable[]来解决此问题:

    nodes = (E[])new Comparable[10];