2014-10-31 105 views
0

因此,当试图将我的Node<T>投射到我的AVLNode<T>时,我得到了这个ClassCastException。不知道为什么。演员异常?

这里是引发异常的地方。

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

什么是来自异常的**精确**堆栈跟踪?为了将来的参考,**总是**发布**完整** stacktrace如果你要求帮助一个例外。 – 2014-10-31 13:50:10

+0

线程“main”中的异常java.lang.ClassCastException:custom.trees.Node无法转换为custom.trees.AVLNode – Whizzil 2014-10-31 13:54:45

+0

请**更新您的问题**并提供相关信息。不要把它放在评论中。 – 2014-10-31 13:55:35

回答

2

您的节点是SuperClassAVLNode。你错误地理解了Java的铸造是如何工作的, 你不能做这样的铸造。你应该投的唯一情况是, 如果你有一个指向AVLnode对象节点的参考,你可以说

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

地方,因为对象类型是一样的,可参考铸造。

你在这里尝试的是将节点(父类)对象的引用强制转换为AVLNode(子类)引用,这根本不可能!

6

基本上,因为se a Node不是AVLNode - 您创建了它Node,所以它是Node。如果您将它创建为AVLNode,则可以将其转换为Node,但不能相反。

+0

所以它是如何工作在这里:https://code.google.com/p/java-algorithms-implementation/source/browse/src/com/jwetherell/algorithms/data_structures/AVLTree.java 看看addValue () 方法。 – Whizzil 2014-10-31 13:58:20

+1

这是因为super.addValue(id)返回的实例是一个AVLNode的实例 – giorashc 2014-10-31 14:08:04

2

您正在铸造NodeAVLNode。由于n1Node的一个实例,因此它不包含AVLNode提供的额外实施,这就是为什么您会收到铸造异常,以防止您在Node实例上执行AVLNode方法。

+0

基本上这可能是一个编译错误,因为两行之间没有对n1进行赋值 – giorashc 2014-10-31 13:53:03