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];
}
}
我正在尝试在 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];
}
}