2014-10-31 5 views
0

Итак, я получаю это 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); 
} //... 

Сообщение об ошибке: Исключение в потоке "основного" java.lang. ClassCastException: custom.trees.Node нельзя отнести к custom.trees.AVLNode

+0

Что такое ** точная ** stacktrace из исключения? Для справок в будущем ** всегда ** публикуйте ** полный ** stacktrace, если вы обращаетесь за помощью к исключению. –

+0

Исключение в потоке «main» java.lang.ClassCastException: custom.trees.Node нельзя отнести к custom.trees.AVLNode – Whizzil

+0

Пожалуйста, обновите свой вопрос ** с соответствующей информацией. Не просто размещайте его в комментариях. –

ответ

2

Ваш узел SuperClassAVLNode. Вы неправильно поняли, как работает Java-кастинг, вы не можете делать такие трансляции как таковые. Единственная ситуация, в которой вы должны бросить это, , если у вас есть опорный узел, который указывает на AVLnode объекта, вы можете сказать

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

где, так как тип объекта такой же, ссылка может быть литыми.

Что вы пытаетесь сделать, это указать ссылку на объект Node (родительский класс) на ссылку AVLNode (Sub-Class), которая просто невозможна!

6

В принципе, becau 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

+1

thats, потому что экземпляр, возвращаемый super.addValue (id), является экземпляром AVLNode – giorashc

2

Вы опускаете литье Node до AVLNode. Поскольку n1 является экземпляром Node, он не содержит дополнительной реализации, предоставляемой AVLNode, и именно поэтому вы получаете исключение кастинга, чтобы предотвратить выполнение вами метода AVLNode по экземпляру Node.

+0

. В принципе, это может быть ошибка компиляции, поскольку не было назначено n1 между двумя строками – giorashc