{a、b、c}をメソッドに渡すことができないのはなぜですか?
-
06-07-2019 - |
質問
初期化リスト{...}をコンストラクターに渡そうとしましたが、機能しませんでした。 代わりにメソッドローカル変数(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 []にキャストしようとしましたか?