11

コード:

Object[] a={ myObject};
someMethod(Object ...arg);

私が試してみると:

someMethod ( {myObject} );

Eclipseでエラーが発生します。

でもいつ:

someMethod ( a );

大丈夫。なぜこの違い?ありがとう。

4

2 に答える 2

21

{ myObject }構文は特別なシンタックスシュガーであり、配列変数を初期化するときにのみ適用されるためです。これは、割り当て自体にタイプ情報がないためです。ただし、割り当ての特殊なケースでは、型は変数から完全に推測されます。

最初の例では、コンパイラーはユーザーがa(であるObject[])に割り当てていることを認識しているため、この構文が許可されます。後者では、変数を初期化していません(Javaの型推論の弱点のため、パラメーター割り当てのコンテキストも完全には機能しません)。したがって、(たとえばブロックを宣言するのではなく)それがあなたがやろうとしていることであると明確に判断できたとしても、配列がどのタイプであるかはわかりません。

呼び出し

someMethod ( new Object[] { myObject } )

変数を使用せずに配列をインプレースで定義する場合に機能します。


上記は質問に答えますが、呼び出しているメソッドは、配列パラメーターを明示的に要求するのではなく、varargsであることに気付きました。したがって、この場合は、単に呼び出すことができます

someMethod(myObject);
于 2012-07-04T16:14:28.437 に答える
6
someMethod(new Object[] { "" });

トリックを行う必要があります!

于 2012-07-04T16:13:23.413 に答える