универсальный массив Java и исключение Classcast - PullRequest
0 голосов
/ 12 июня 2018

Я объявил BinaryTree как показано ниже:

public class BinaryTree<T extends Comparable<T>> {}

Но когда я звоню

Character[] actual = binaryTreeChar.preOrderTraversal(root, Character[].class); 

, это вызывает исключение, как показано ниже.

java.lang.ClassCastException: [[Ljava.lang.Character;не может быть приведен к [Ljava.lang.Comparable;

Есть ли лучший способ решить эти дела?

public T[] preOrderTraversal(BinaryNode<T> root, Class<T[]> clazz) {
        if (root == null)
            return null;
        T[] array = (T[]) Array.newInstance(clazz, count);
        Stack<BinaryNode<T>> stack = new Stack<>();
        stack.push(root);
        int i = 0;
        while (!stack.empty()) {
            BinaryNode<T> next = stack.pop();
            array[i++] = next.data;
            if (next.right != null)
                stack.push(next.right);
            if (next.left != null)
                stack.push(next.left);
        }
        return array;
    }


}

1 Ответ

0 голосов
/ 12 июня 2018

Это должно быть:

public T[] preOrderTraversal(BinaryNode<T> root, Class<T> clazz)

И:

Character[] actual = binaryTreeChar.preOrderTraversal(root, Character.class);

Как и сейчас, вы создаете экземпляр Character[][] (то есть двумерный массив).

Class, переданный Array.newInstance, является типом компонента массива, а не типом массива.

Объект java.lang.reflect.Array.newInstance(Класс componentType, int length) throws NegativeArraySizeException

Создает новый массив с указанным типом компонента и длиной ...

Параметры:

componentType объект Class, представляющий тип компонента нового массива
длина длина нового массива

...