3

従来のコード ベースを java1.6 から 1.7 に移行しようとしていますが、コンパイル中に次のエラーが発生します。

create への参照があいまいです。メタのメソッド create(long,Object...) とメタのメソッド create(Object...) の両方が一致します

ここで Meta はクラス名です。このエラーは、JDK1.7 でコンパイルする場合にのみ見られます。1.6 では正常にビルドされており、すべての依存関係も正常に機能しています。

2 つの多相関数は次のとおりです。

 create(long id, Object... paramters) {
    ....
 }

create(Object... paramters) {
   ....
}

これを解決して、コードが 1.6 コンパイルと 1.7 コンパイルの両方で機能するようにする方法。

編集:エラーをスローしている呼び出しの例を追加:

Id.create(1234);
Id.create(id); // id is a long value
4

2 に答える 2

4

これは、Java 7 コンパイラの修正が原因です。

JDK 7 と JDK 6 間の非互換性

分野: ツール

概要: 最も具体的な varargs メソッドの選択の変更

説明: javac コンパイラのオーバーロード解決アルゴリズムは、特定の呼び出しサイトに複数のメソッドを適用できる場合に、最も具体的な varargs メソッドを選択する方法が修正されました (JLS、Java SE 7 Edition、セクション 15.12.2.5 を参照)。 .

...

javac コンパイラは JDK 7 より前よりも多くのコードを受け入れますが、この修正により、次の場合にソースの互換性がわずかに失われます。

class Test {
    void foo(int... i) {}
    void foo(Object... o) {}

    void test() {
       foo(1,2,3);
    }
}

このコードは JDK 6 でコンパイルされます (最も具体的なメソッドは foo(int...) です)。このコードは、JDK 7 ではコンパイルできません。


両方の JDK でコードを機能させるには、適切なメソッドを選択するための追加のヒントをコンパイラに与える必要があります。

Id.create(1234, new Object[0]);
Id.create(id, new Object[0]);

これはcreate(long id, Object... parameters)、JDK6 と JDK7 の両方で を呼び出し、varargs 部分にサイズ 0 の配列を渡します。これは、元のコードで Java 6 の場合にも渡されます。

それにもかかわらず、これは少し奇妙に見えます。メソッドの呼び出しが署名に依存しないように、(読みやすくするために) メソッドのいずれかの名前を変更することを選択するでしょう。

また、Java6 のライフサイクルが終了していることも考慮する必要があります。そのため、最初に Java7 でコンパイルできるようにコードを変更するという別のオプションが考えられます。

于 2013-04-05T09:56:59.713 に答える