因此,在尝试将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
答案 0 :(得分:6)
基本上,因为Node
不是AVLNode
- 您创建的是Node
,所以它是Node
。如果您将其创建为AVLNode
,则可以将其投放到Node
,但不能反过来。
答案 1 :(得分:2)
您正在向Node
投降AVLNode
。由于n1
是Node
的一个实例,因此它不包含AVLNode
提供的额外实现,这就是为什么你得到强制转换异常以阻止你执行{{1}的方法在AVLNode
个实例上。
答案 2 :(得分:2)
您的节点是AVLNode
的 SuperClass 。您误解了Java Cast的工作原理,
你不能做这样的演员表。你应该施展的唯一情况是,
如果你有一个指向AVLnode
对象的节点引用,你可以说
Node n1=new AVLNode();
AVLNode n2=(AVLNode)n1;
其中,由于对象类型相同,因此可以对引用进行转换。
您在这里尝试的是将一个Node(父类)对象的引用转换为AVLNode(子类)引用,这是不可能的!