9

初期化リスト{...}をコンストラクターに渡そうとしましたが、機能しませんでした。代わりにメソッドローカル変数(int [])で宣言すると、問題なく機能しました。

何故ですか?

public class QuickSort {
    int[] a;

    public QuickSort(int[] a) {
        this.a = a;
    }

    public static void main(String[] args) {
        // ###################
        // ###    WORKS     ##
        // ###################
        int[] a = {8,12,79,12,50,44,8,0,7,289,1};
        QuickSort sort = new QuickSort(a);

        // ###################
        // ### DOESN'T WORK ##
        // ###################
        //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
    }
}
4

7 に答える 7

20

を宣言しint[]て割り当てると{1, 2, 3}、コンパイラは、そのint[]場で綴られているとおりにを作成する必要があることを認識します。

配列をメソッド呼び出しに直接貼り付ける後者の場合、使用する必要があります

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

配列が何であるかをコンパイラに通知します。

于 2009-06-19T11:38:41.267 に答える
10

この{}構造は配列初期化子と呼ばれ、Java で配列を初期化するために使用されます。(参照:セクション 10.6: Java 言語仕様、第 3 版の配列初期化子。)

渡すこと自体が有効でない理由{1, 2, 3}は、初期化子に関連付けられた型情報がないためです。

したがって、配列の型をコンパイラに知らせる必要がありますnew Type[]。ここで、Typeは配列が作成される型です。

以下はすべて、配列初期化子の有効な使用法です。

  • new String[] {"Hello, "World"}
  • new Character[] {'A', 'B'}
  • new Runnable[] {new Runnable() {public void run() {}}, new Runnable() {public void run() {}}

ご覧のとおり、この表記法は多くのデータ型に使用できるため、整数に固有のものではありません。

はどうかと言うと:

int[] a = {1, 2, 3};

上記が有効な理由は、型情報が変数の型宣言でコンパイラに提供されるためです。この場合はint[]です。上記が意味することは次のことです。

int[] a = new int[] {1, 2, 3};

があれば、その場でnew int[] {1, 2, 3}新しいint[]配列を作成できるので、他のint[]配列と同じように処理できます。変数名が関連付けられていないだけです。

したがって、によって作成された配列は、引数としてnew int[] {1, 2, 3}a を取るメソッドまたはコンストラクターに送信できます。int[]

new Quicksort(new int[] {1, 2, 3});  // This will work.
于 2009-06-19T11:51:20.210 に答える
4

これはおそらく、初期化リストに入力情報がないためです。これを試して:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});
于 2009-06-19T11:38:49.457 に答える
4

次のようにすることもできます。

public class QuickSort {
    int[] a;

    public QuickSort(int ... a) {
        this.a = a;
    }

    public static void main(String[] args) {

        QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
    }
}
于 2009-06-19T11:50:12.630 に答える
2

Java には実際には型推論がありません。配列変数の宣言は、Java 言語仕様の特殊なケースであり、メソッド パラメーターには適用されません。そうすることは可能ですが、{"a", "b"} が String[] または Object[] を作成するかどうかなどの質問を処理する必要があるため、仕様に多くの複雑さが追加されます。しかし、それが複雑な型階層のオブジェクトの場合はどうなるでしょうか? また、メソッドがオーバーロードされ、両方のバージョンが存在する場合はどうなるでしょうか?

于 2009-06-19T11:46:18.910 に答える
0

中括弧 (配列リテラルで使用する場合) は、配列を宣言する場合にのみ使用できます:)

于 2009-06-19T11:56:54.880 に答える
-1

リストをコンストラクターに渡す前に、リストをint []にキャストしてみましたか?

于 2009-06-19T11:37:49.940 に答える