以前は、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;
}
同様にトライを実装できると思いました:
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>[] へのキャストの違いは何ですか? なぜ前者は許可され、後者は許可されないのですか?