过去,我可以通过将 Object[] 转换为 E[] 来实现一个通用的 ArrayList:
public class ArrayList<E>
{
private E[] elements;
@SuppressWarnings("unchecked")
public ArrayList()
{
elements = (E[])new Object[16];
}
}
我可以正常使用泛型数组,如下所示:
public void add(E element)
{
...
elements[size++] = element;
}
我想我可以类似地实现一个 trie:
public class Trie<V>
{
private static class Node<V>
{
public V value;
@SuppressWarnings("unchecked")
public Node<V>[] next = (Node<V>[])new Object[26];
}
private Node<V> root = new Node<V>();
}
但是,public Node<V>[] next = (Node<V>[])new Object[26];
Trie.Node 中的行会导致 ClassCastException:
public class Main
{
public static void main(String[] args)
{
ArrayList<Integer> a = new ArrayList<Integer>();
Trie<Integer> t = new Trie<Integer>();
}
}
java Main
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LTrie$Node;
at Trie$Node.<init>(Trie.java:6)
at Trie$Node.<init>(Trie.java:3)
at Trie.<init>(Trie.java:10)
at Main.main(Main.java:6)
所以它说我不能将 Object[] 转换为 Trie.Node[]。
从 Object[] 转换为 E[] 和从 Object[] 转换为 Trie.Node<V>[] 有什么区别?为什么前者被允许而不是后者?