Исключение приведения класса в Java: не может быть приведено - PullRequest
0 голосов
/ 16 февраля 2011

Может ли кто-нибудь сказать мне, что является ошибкой в ​​этом коде?

public class Node<T> {
    private int degree;
    @SuppressWarnings("unchecked")
    T[] keys ;
    Node<T>[] children;
    Node(int degree) {
        System.out.println(degree);
        this.degree = degree;
        @SuppressWarnings("unchecked")
        Node<T>[] children = (Node<T>[])new Object[degree * 2];
        @SuppressWarnings("unchecked")
        T[] keys       = (T[])new Object[(degree * 2) - 1];
     }

     public static void main(String[] s) {
        Node<Integer> a = new Node<Integer>(5);
     }
}

По сути, я хочу, чтобы объект ссылался сам на себя, что объект хранит массив своих собственных объектов.Я получаю эту ошибку

Исключение в потоке "main" java.lang.ClassCastException: [Ljava.lang.Object;невозможно преобразовать в [Tree.Node;

Дерево - это имя моего пакета.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2011

Вместо массивов для ваших детей и ключей используйте List<Node<T>> и List<T>ArrayList в качестве реализации). Таким образом вы скрываете сложность создания и приведения массива внутри класса ArrayList. (Он также использует Object[], но преобразует только в get() и аналогичные методы вместо создания универсального массива).

Или, поскольку создается впечатление, что вы все равно создаете карту, используйте Map<T, Node<T>> для ваших ключей и узлов (однако, у вас нет доступа к индексу).

2 голосов
/ 16 февраля 2011

Вы не можете создать типизированный массив. Вы должны сделать это:

Node<T>[] children = new Node[degree * 2];

И иметь дело с тем, что массивы нетипизированы: (

1 голос
/ 16 февраля 2011

Вы не можете сделать это:

Node<T>[] children = (Node<T>[])new Object[degree * 2];

Здесь вы создаете массив объектов, а объект не является узлом.Вместо этого вы должны создать массив Node, т.е.

Node<T>[] children = new Node[degree * 2];

В вашем коде дважды встречается одна и та же ошибка.

0 голосов
/ 16 февраля 2011

Вы не можете привести объект к узлу:

Node<T>[] children = (Node<T>[])new Object[degree * 2];

Либо вы думаете об этом неправильно: «Любой объект может быть узлом», когда единственное, что является истинным, это«Каждый узел - это объект», или вы привыкли к C ++ или подобному, в котором вы можете привести пустой указатель к любому другому указателю.

Кроме того, у вас не может быть массивов универсальныхтипы .Например, вам нужно будет создать тип оболочки.StringNode extends Node<String> для того, чтобы сохранить их в массиве.

Этот фрагмент, например, прекрасно компилируется:

class Node<T> {
}

class StringNode extends Node<String> {
}

public class Test {
    public void method() {
        Node<String>[] children = new StringNode[5];
    }
}
...