4

たとえば、これらの機能があるとしたら、なぜですか。

void func1(Object o){
      //some code
}
void func1(Object[] o){
      //some code
}

たとえば、次のように呼び出すことができます。

func1("ABC");

しかし、そうではありません:

func1({"ABC", "DEF"}); // instead having to write:
func1(new Object[]{"ABC", "DEF"});

質問: 配列でコンストラクターを呼び出す必要がある特別な理由はありますか?

4

4 に答える 4

5

配列初期化子」は、宣言/割り当てでのみ使用できます。

Object[] o = { 1, 2 };

または「配列作成式」の場合:

new Object[] { 1, 2 };

メソッド呼び出し用ではありません:

// Doesn't work:
func1({1, 2});

それが現状です... JLSの10.6章でそれについて読むことができます。配列初期化子。抜粋:

配列初期化子は、宣言(§8.3§9.3§14.4)で指定するか、配列作成式(§15.10)の一部として指定して、配列を作成し、いくつかの初期値を提供することができます。

現在JLSで定義されていないことを除けば、将来のJavaバージョンで配列初期化子/配列リテラルを他のコンテキストで使用できなくなる理由はないようです。配列型は、配列リテラルが使用されているコンテキストから、または含まれている変数初期化子から推測できます。

もちろん、func1varargs引数を持つことを宣言することもできます。ただし、コールサイトで混乱が生じる可能性があるため、オーバーロードには注意する必要があります。

于 2012-09-17T12:07:27.697 に答える
5

Java SE 5.0 に配列リテラル表記を導入するという提案がありました。残念ながら、代わりに varargs を取得しましたが、それに伴うすべての楽しみがあります。

なぜという質問に答えると、言語はまさにそのようなものです。Java の新しいバージョンでは、リスト リテラルが表示される場合があります。

于 2012-09-17T12:08:43.900 に答える
1

Javaがまだ実際にサポートしていないインライン配列の初期化を実行しようとしています。

必要に応じて varargs を使用して目的の結果を達成できると思いますが、メソッドに配列を渡す必要がある場合は、Java が配列を初期化するのを好む方法で初期化する必要があります。

于 2012-09-17T12:15:15.310 に答える
0

値を持つfunc1("ABC")タイプのオブジェクトを呼び出すと、 Javaによって自動的に作成されます。タイプ以外のオブジェクトを作成するには、演算子を使用する必要があります。String"ABC"

Stringnew

于 2012-09-17T12:06:09.620 に答える