对方法的引用是模糊的方法引用vs lambda

时间:2018-05-03 07:24:44

标签: java-8 javac method-reference

我有以下课程

界面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

1 个答案:

答案 0 :(得分:-1)

如果将方法引用调用强制转换为FincN,它将进行编译。 Test类中有两个重载方法调用'define',因此编译器会混淆选择哪一个。所以尝试使用如下。

    public static void main(String[] args){
      Test.define((FuncN) State::mergeStates,()->true);
    }