0

以前は、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>[] へのキャストの違いは何ですか? なぜ前者は許可され、後者は許可されないのですか?

4

3 に答える 3

2
public Node<V>[] next = (Node<V>[])new Object[26];

に変更する必要があります

public Node<V>[] next = (Node<V>[])new Node[26];

あるいは

public Node<V>[] next = new Node[26];

とにかくキャストはチェックされず、両方のフォームが必要なため@SuppressWarnings("unchecked")

于 2012-09-26T11:47:32.687 に答える
1

違いは、ジェネリックが消去によって実装され、境界を指定しないとそのジェネリック型が に消去されることObjectです。E[]になりますObject[]、その間Trie.Node<V>[]になりTrie.Node<Object>[]ます。したがって、(Node<V>[])new Object[26];にキャストしようとしているのは無効なキャストObject[]ですNode<Object>[]

消去の仕組みの詳細については、http://docs.oracle.com/javase/tutorial/java/generics/erasure.htmlを参照してください。

于 2012-09-26T09:25:59.240 に答える
0

Node<V>[] 配列ではありませんV[]Type 情報が E であり、ArrayList が Strong Typing を使用しているため、最初のケースで機能します。

したがって、画像からジェネリックを削除すると、クラスキャスト例外が発生するキャストが行われますObject[]Node[]

あなたは使いたいかもしれませんV[]

public V[] next = (V[])new Object[26];

ジェネリック チュートリアルで利用可能な詳細情報

于 2012-09-26T09:23:14.100 に答える