我在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 +我知道有不同的编译器。我想知道,我的代码是否正常。
更新 说明:
换句话说,应该选择CALL_1
。