質問

初期化リスト{...}をコンストラクターに渡そうとしましたが、機能しませんでした。 代わりにメソッドローカル変数(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});
    }
}
役に立ちましたか?

解決

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

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

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

コンパイラに配列を伝える。

他のヒント

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

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

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

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

  • new String [] {" Hello、" World"}
  • 新しいキャラクター[] {'A'、 'B'}
  • 新しい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} によって作成された配列は、 int [] をそのメソッドとして取るメソッドまたはコンストラクターに送信できます。引数:

new Quicksort(new int[] {1, 2, 3});  // This will work.

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

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

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

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);
    }
}

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

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

リストをコンストラクタに渡す前にリストをint []にキャストしようとしましたか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top