2

タイトルに対応して、私の問題は、このジェネリック型で初期化されたクラスのインスタンス内にあるジェネリック配列の配列長を取得することです。配列の長さ(ak.array.length)を取得したい場合、javaは次のエラーをスローします。

スレッド"main"の例外java.lang.ClassCastException:[Ljava.lang.Object; [Ljava.lang.String;にキャストできません。Testclass.main(Testclass.java:15)で

では、このコードのどこに私の欠点がありますか?前もって感謝します

public class Testclass {

    static class ArrayKeeper<T> {
        protected T[] array;

        public ArrayKeeper() {
            array = (T[])new Object[5];
        }
    }

    public static void main(String[] args) {
        //create a new instance of inner class ArrayKepper (type String)
        Testclass.ArrayKeeper<String> ak = new Testclass.ArrayKeeper<String>();
        System.out.println(ak.array.length); //cast error here.
    }
}
4

2 に答える 2

4

問題は次の行にあります。

array = (T[]) new Object[5];

これはジェネリック配列を作成する方法ではObject[]ありませんString[]。意図したとおりではなく、を作成しています。を作成してから、必要な型にキャストすることはできませんObject[]。正しいクラスの配列を作成する必要があります。代わりにこれを試してください:

public ArrayKeeper(Class<T> clazz, int size) {
    array = (T[]) Array.newInstance(clazz, size);
}

そして、インスタンス化する必要がある場合は、次のようにしますArrayKeeper

Testclass.ArrayKeeper<String> ak =
    new Testclass.ArrayKeeper<String>(String.class, 5);
于 2012-05-22T16:37:59.903 に答える
2

にをキャストできないという理由だけlengthで、でゲッターを実装する必要があると思います。呼び出しはそのキャストを実行しようとします。ArrayKeeperObject[]String[]ak.array

于 2012-05-22T16:35:04.480 に答える