java.lang.ClassCastException: class [Ljava.lang.Object;无法转换为 class

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class

我正在尝试在 Java 中实现一个 trie。当我测试我的方法“插入”是否有效时,出现以下错误。

Exception in thread "main" java.lang.ClassCastException: 
class [Ljava.lang.Object; cannot be cast to class [LTrie$TreeNode; ([Ljava.lang.Object; 
is in module java.base of loader 'bootstrap'; [LTrie$TreeNode; is in unnamed module of loader 'app')
at Trie.insert(Trie.java:36)
at Trie.main(Trie.java:47)

我也遇到了一些类似的问题,但仍然无法弄清楚。我想知道为什么我们不能将类型从 Object 转换为 TreeNode[] 数组。

我的代码如下。我知道通过数组使用 dataIndexedCharMap 会浪费很多内存(HashTable 或 BST 会是更好的方法),但我只是想比较这三种方法的内存和效率但遇到了一些麻烦。

class Trie {
    private static final int R = 128;
    public TreeNode root;

    private static class TreeNode {
        private boolean isKey;
        private dataIndexedCharMap next;
        private TreeNode(boolean b, int R) {
            isKey = b;
            next = new dataIndexedCharMap<TreeNode>(R);
        }
    }

    public static class dataIndexedCharMap<V> {
        private V[] items;
        public dataIndexedCharMap(int R) {
            items = (V[]) new Object[R];
        }
    }

    /** Initialize your data structure here. */
    public Trie() {
        root = new TreeNode(false, R);
    }

    /** Inserts a word into the trie. */
    public void insert(String word) {
        TreeNode curr = root;
        for (int i = 0; i < word.length(); i++) {
            TreeNode[] array = (TreeNode[]) curr.next.items;
            array[word.charAt(i)] = new TreeNode(false, R);
            curr = array[word.charAt(i)];
            if (i == word.length() - 1) {
                curr.isKey = true;
            }
        }
    }

    public static void main(String[] args) {
        Trie obj = new Trie();
        obj.insert("apple");
    } 
}

从您的代码看来,dataIndexedCharMap 总是会包含 TreeNode 类型的项目。在那种情况下,不需要创建对象数组并将其转换为 TreeNode。您可以创建 TreeNode[] 数组而不是 Object[] 数组,并删除您添加的所有泛型。

public static class dataIndexedCharMap {
    private TreeNode[] items;
    public dataIndexedCharMap(int R) {
        items =  new TreeNode[R];
    }
}