0

Eclipse で次のクラスを作成しましたjavacが、コンパイルに失敗しましたが、報告されたあいまいさはjavac解決できると思います。

public class EclipseCompilerVsJavac {

    interface MyClass {
        Integer methodOverload(String a); // METHOD_1
        void methodOverload(String a, Integer b);
    }

    @FunctionalInterface
    interface Fun1<P,R> {
        R invoke(P p);
    }
    @FunctionalInterface
    interface Fun2<P1,P2,R> {
        R invoke(P1 p1, P2 p2);
    }

    static class R_m_P  {
    }

    <P, R> R call(Fun1<P, R> fun, P p, R_m_P signature) { // CALL_1
        return null;
    }
    <P1, P2, R> R call(Fun2<P1, P2, R> fun, P1 p1, P2 p2) {
        return null;
    }

    public static void main(String[] args) {
        EclipseCompilerVsJavac example = new EclipseCompilerVsJavac();
        MyClass myClass=null;

        // !!! PROBLEMATIC LINE !!! 
        example.call(myClass::methodOverload, "a", new R_m_P());
    }    
}

私の意見CALL_1では、より良い一致であるため、選択するMETHOD_1必要があります。javacそれはバグですか、それともjavac仕様に従っており、Eclipse は情報を使用してはいけませんか?

Javac エラー メッセージ:

... call への参照があいまいです - メソッド call(Fun1,P,R_m_P) EclipseCompilerVsJavac と EclipseCompilerVsJavac のメソッド call(Fun2,P1,P2) の両方が一致します

私はJDK 8とEclipse STS 3.63を使用しています+異なるコンパイラがあることを知っています。私のコードがOKかどうか知りたいです。

更新: 説明:

  • example.call/3 が呼び出されます
    • 第 1 パラメーター: 決定には使用できません - call/3 メソッドは両方の methodOverload バリアントを参照するため
    • 2 番目のパラメーター: 使用できません - call/3 の両方にジェネリックがあります
    • 3 番目のパラメーター: R_m_P パラメーターは P2 ジェネリックよりも具体的であるため、使用する必要があります

つまり、CALL_1選択する必要があります。

4

0 に答える 0