Generics + FunctionalInterface在Eclipse中编译,在javac中失败

时间:2015-01-21 12:15:48

标签: java eclipse generics javac functional-interface

我在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错误消息:

  

...对调用的引用是不明确的 - 两个方法调用(Fun1,P,R_m_P)   EclipseCompilerVsJavac和方法调用(Fun2,P1,P2)   在EclipseCompilerVsJavac匹配

我使用JDK 8和Eclipse STS 3.63 +我知道有不同的编译器。我想知道,我的代码是否正常。

更新 说明:

  • example.call/3被调用
    • 第一个参数:不能用于决策 - 因为call / 3方法引用了methodOverload variants
    • 第二个参数:不能使用 - 两个呼叫/ 3都有泛型
    • 第3个参数:应该用作R_m_P参数比P2泛型更具体

换句话说,应该选择CALL_1

0 个答案:

没有答案