施放异常?

时间:2014-10-31 13:47:47

标签: java nodes binary-search-tree classcastexception

因此,在尝试将ClassCastException投射到我的Node<T>时,我会获得此AVLNode<T>。不知道为什么。

这是抛出异常的地方。

Node<Integer> n1 = new Node<Integer>(3, null);
    AVLNode<Integer> n2 = (AVLNode<Integer>) n1;

课程如何......

public class Node<T extends Comparable<T>> {

public Node<T> right;

public Node<T> left;

public Node<T> parent;

public T data;

public Node(T data, Node<T> parent) {
    this.data = data;
    this.parent = parent;
} // ...

另一个类在单独的文件中:

public class AVLNode<T extends Comparable<T>> extends Node<T> {

public int height = 1;

public AVLNode(T data, Node<T> parent) {
    super(data, parent);
} //...

错误讯息: 线程“main”中的异常java.lang.ClassCastException:custom.trees.Node无法强制转换为custom.trees.AVLNode

3 个答案:

答案 0 :(得分:6)

基本上,因为Node不是AVLNode - 您创建的是Node,所以它是Node。如果您将其创建为AVLNode,则可以将其投放到Node,但不能反过来。

答案 1 :(得分:2)

您正在向Node投降AVLNode。由于n1Node的一个实例,因此它不包含AVLNode提供的额外实现,这就是为什么你得到强制转换异常以阻止你执行{{1}的方法在AVLNode个实例上。

答案 2 :(得分:2)

您的节点是AVLNode SuperClass 。您误解了Java Cast的工作原理, 你不能做这样的演员表。你应该施展的唯一情况是, 如果你有一个指向AVLnode对象的节点引用,你可以说

Node n1=new AVLNode();
AVLNode n2=(AVLNode)n1;

其中,由于对象类型相同,因此可以对引用进行转换。

您在这里尝试的是将一个Node(父类)对象的引用转换为AVLNode(子类)引用,这是不可能的!