15

私は定義しました:

public static int[] getArray( final int... params ) {
    return params;
}
public static <T> T[] getArray( final T... params ) {
    return params;
}

そして、私はこれを

getArray( 1, 2 )

そして今、Eclipse 4.2でコンパイルエラーが発生します:

メソッドは型に対してあいまいです

しかし、ご覧のとおり、これはあいまいではありません。私に何ができる?

4

2 に答える 2

24

これは、日食バグ383780のバグとして報告されました。
修正のドキュメントは次のとおりです: https ://bugs.eclipse.org/bugs/attachment.cgi?id = 218320

基本的に、コンパイラエラーを修正するには、最新のEclipseリリース(現在は4.2.1-vmargs )を入手し、次の行を後に追加しますeclipse.ini:(その後、Eclipseを再起動してプロジェクトを再構築する必要がある場合があります)

-DtolerateIllegalAmbiguousVarargsInvocation=true

そうは言っても、サミュエルは正しいです。メソッドの呼び出しはあいまいです。上記のコード例は、1.6より前のJDKにバグがあったため、以前は機能していました。Eclipseのカスタムコンパイラはこのバグをうまく模倣しました。Junoを開発する際、あいまいな呼び出しをエラーとして報告し、多くの人(私を含む)を悩ませることで、このバグを修正しました(JDKのバグは1.7で修正されたため)。上記の修正では、eclipseに「不正なあいまいなVarargsの呼び出しを許容する」ように明示的に指示するように求められます。

于 2012-11-13T00:44:35.540 に答える
9

実際、これはあいまいです。なぜなら、Java のAutoboxingintを使用すると、 を期待するメソッドを呼び出すことができInteger、その逆も可能であり、getArray( 1, 2 )どのメソッドに対しても実際に有効な呼び出しになる可能性があるからです。

あなたが何をしているのかを理解している限り、何でも配列を作成するためのユーティリティメソッドが必要です。おそらく、あなたができる最も簡単なことは、を扱うメソッドの名前を に変更することintですgetIntArray()。または、配列new int[] {1, 2}が必要な場合は、非常に読みやすい which を使用してください。int

この情報は、http://docs.oracle.com/javase/specs/jls/se5.0/jls3.pdfの言語の仕様で見つけることができます(あなたの場合、呼び出されたメソッドを決定すると、セクション 15.12.2 コンパイル時のステップ 2: メソッド シグネチャの決定で説明されているプロセス。アリティ変数を使用し、ステップ 3 で両方のメソッド呼び出しが有効であるため)

于 2012-06-01T17:23:48.690 に答える