2014-10-31 129 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