2017-07-31 30 views
1

我正在尝试在Java中编写BinarySearchTree的代码。当我尝试通过实例化Integer 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; 

我不是很熟悉泛型,但我猜这是因为Object没有定义的compareTo方法?如果这条线不起作用,我还有什么其他的选择,这样我可以有一个数组,可以以某种方式持有泛型Comparable类型?

+0

您在构造函数中也有编译错误。请确保您发布的调试代码帮助编译的代码能够重现您尝试获得帮助的问题! :) – nbrooks

+1

[如何在Java中创建通用数组?]可能的重复(https://stackoverflow.com/questions/529085/how-to-create-a-generic-array-in-java) – nbrooks

+0

[本答案](https://stackoverflow.com/a/4221845/803925)特别应该是如何处理这种情况的一个很好的例子。你最终会做一些类似于'clazz.cast(Array.newInstance(clazz.getComponentType(),size))'的地方,其中'clazz'的类型为'Class ',并且是你的构造函数的一个参数。当你调用它时你会传入'Integer [] .class'。如果你使用的是集合而不是数组,那么这会容易得多。 – nbrooks

回答

1

因为数组的运行时类是[Object(作为代码“new Object [10]”),所以得到这个异常。由于Object是所有其他类的超类,因此不能将对象数组转换为任何其他类型的数组。

1.无法将A型阵列转换为B型阵列,但A是B'的子类。
2.事件将子类型数组转换为超类型数组,但该数组仍然只存储子类型元素,因为运行时类型仍为[子类型。

你可以用下面的代码试试:

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]; 
} 
} 
1

E[]擦除是Comparable[](因为上限的EComparable<E>),因此在运行时将转换为Comparable[],由于该对象的实际运行时类型为Object[],因此该操作失败。您可以通过创建Comparable[]来代替此问题来解决此问题:

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