我有以下课程
界面1
package test;
public interface TODO {
boolean test();
}
界面2
package test;
@FunctionalInterface
public interface FuncN {
State zip(State ...states);
}
第1课
package test;
public class Test {
public static Test define(FuncN zipperFunc,TODO... tasks) {
return null;
}
public static Test define(TODO... tasks) {
return null;
}
}
第2课
包裹测试;
public class State {
public static State mergeStates(State ...states) {
return null;
}
}
主要班级
package test;
public class Main {
public static void main(String[] args) {
Test.define(State::mergeStates,()->true);
}
}
类main不编译,抛出错误
对define的引用含糊不清 Test.define(国家:: mergeStates,() - >真); ^ 测试匹配中的方法定义(FuncN,TODO ...)和测试匹配中的方法定义(TODO ...)
下面的类确实编译:
package test;
public class Main {
public static void main(String[] args) {
Test.define(states->State.mergeStates(states),()->true);
}
}
然而,我没有看到任何含糊之处。 FuncN和TODO的签名是完全不同的,我不认为编译器应该将它们误认为是彼此。
如果我错了,请纠正我。
P.S。使用eclipse无法重现错误,所以我建议创建一个文件夹测试,在其中创建所有java文件并运行javac test / Main.java
答案 0 :(得分:-1)
如果将方法引用调用强制转换为FincN,它将进行编译。 Test类中有两个重载方法调用'define',因此编译器会混淆选择哪一个。所以尝试使用如下。
public static void main(String[] args){
Test.define((FuncN) State::mergeStates,()->true);
}