1

データ構造のスキルを磨いています。Open Data Structures in Javaという素晴らしい無料の本をオンラインで見つけました。それを読んだ後、提供されたコードを使用して、記載されているすべてのデータ構造を作成しようとしています。これにより、それらを記憶に植え付けることができます。

私は「エラー」に遭遇しましたが、私の人生ではそれを理解することはできません: (セクション 2.1.2)のresize()メソッドには、コード行があります - . これのポイントは、要素を含む配列が小さすぎたり大きすぎたりしないようにすることです。このコード行を使用すると、Eclipse から次のエラー メッセージが表示されます。ArrayStackT[] b = newArray(Math.max(n*2,1));

The method newArray(int) is undefined for the type ArrayStack<T>.

ですから、それは「タイプミス」であり、「新しい配列」という意味だったに違いないと考えています。しかし、それを修正すると、Eclipse から次のエラー メッセージが表示されます。

Type mismatch: cannot convert from Array to T[].

何が欠けているのか、間違っているのかわかりません。私の質問を要約すると、特に固定サイズで、新しいジェネリック配列をどのように宣言してインスタンス化するのですか?

4

3 に答える 3

2

のクラスを考えると、Tそれを呼び出しましょうklass...

長さ の 1 次元配列の場合n:

T[] arr = (T[]) Array.newInstance(klass, n)

長さ の 2 次元配列の場合n x m:

T[][] 2dArr = (T[][]) Array.newInstance(klass, n, m)

上記は実際には 2 つの異なる関数です。一方はint引数を取り、もう一方は引数を取りint...、配列として渡すこともできます。Objectどちらも、未チェックのキャストが必要な を返します。

長さn、2 番目の次元が未定のジャグ配列が必要な場合は、 のクラスを取得し、それを とT[]呼びましょう。klass2

T[][] 2dArr2 = (T[][]) Array.newInstance(klass2, n)

これが、タイプを に渡す必要がある理由です。そうしないと、タイプがわからないため、バニラメソッドのcollection.toArray(T[] arr)を取得します。Object[]toArray()

于 2013-02-21T01:52:06.670 に答える
1

あなたが望むものは:

void resize() {
    T[] b = new T[Math.max(n*2,1)];
    for (int i = 0; i < n; i++) {
        b[i] = a[i];
    }
    a = b;
}

しかし、T は実行時に実際には認識されておらず、認識されている必要があるため、これは機能しません。ただし、これはジェネリック セーフ コンストラクターを使用して記述できます。

void resize() {
    T[] b = (T[]) Array.newInstance( a.getClass().getComponentType(),
                                     Math.max(n*2,1) );
    for (int i = 0; i < n; i++) {
        b[i] = a[i];
    }
    a = b;
}

作成者は、そのクラスに newArray メソッドを含めることを意図していたようです。

void T[] newArray(int size) {
    return (T[]) Array.newInstance( a.getClass().getComponentType(), size);
}
于 2013-02-21T01:57:03.537 に答える
0

Javaはこれを単純な問題にしません。型消去のため、実行時にTのクラスを使用できません(作成する配列のタイプを決定する必要がある場合)。

ただし、すでに配列(a)があるため、リフレクションを使用してそのタイプの新しい配列を作成できます。

次のようになります。

import java.lang.reflect.Array;

public class Test {

        public static void main(String args[]) throws Exception {
                Object array[] = new Object[5];

                array = resizeArray(array, 10);

                for (Object o : array) {
                        System.out.println(o);
                }
        }

        public static <T>
        T[] resizeArray(T[] a, int newSize) throws Exception {
                T[] b = (T[]) Array.newInstance(a.getClass().getComponentType(),
                                                newSize);

                for (int i = 0; i < a.length; i++) {
                        b[i] = a[i];
                }

                return b;
        }
}
于 2013-02-21T01:34:50.397 に答える