Java 8 Lambda表达式 - 方法重载疑问

Bal*_*alu 2 java lambda java-8

我正在尝试学习Lambda表达式,

interface MathOperartor 我已经确定使用Lambda表达式可以做到的操作()重载了,我确实可以使用Lambda表达式,但似乎无法弄清楚这里的问题是什么:

public static void main(String[] args) {
    LambdaLearning lb = new LambdaLearning();

    MathOperartor add = (a , b )->  a + b;  // error: The target type of this expression must be a functional interface
    MathOperartor sub = (a , b) -> a - b;   // same error
    MathOperartor mul = (a , b) -> a * b;   //  ''
    MathOperartor div = (a , b) -> a / b;   //  ''

    System.out.println(lb.operate(10, 15, add));
    System.out.println(lb.operate(10.5f, 15.5f, sub));
    System.out.println(lb.operate(10, 15, mul));
    System.out.println(lb.operate(10, 15, div));

}

interface MathOperartor{
    public Object operate(int a, int b);
    public Object operate(float a, float b);
}

private Object operate(int a, int b, MathOperartor math){
    return math.operate(a,b);
}
private Object operate(float a, float b, MathOperartor math){
    return math.operate(a,b);
}
Run Code Online (Sandbox Code Playgroud)

请让我知道我在这里做错了什么,并建议修复......

更新:

好的,所以我理解了功能界面的概念,我的问题也是关于实现我在上面的代码中尝试做的事情,我发现了几种方法.

谢谢大家的宝贵答案!

hol*_*ava 6

功能接口必须是一个SAM接口:

功能界面只有一个抽象方法.由于默认方法具有实现,因此它们不是抽象的.如果接口声明了一个覆盖java.lang.Object的公共方法之一的抽象方法,那么它也不会计入接口的抽象方法计数,因为接口的任何实现都将具有java.lang.Object或其他地方的实现.

你的接口声明了2个抽象方法,lambda表达式不知道去哪里,lambda表达式是该接口的一个实例,这意味着必须实现接口中声明的所有抽象方法.但是你可以在这种情况下添加默认方法来解决你的问题,例如:

interface MathOperartor{
  //it also can be removed, since a int can cast to a float automatically
  default Object operate(int a, int b){
     return operate((float)a, (float)b);
  }
  public Object operate(float a, float b);
}
Run Code Online (Sandbox Code Playgroud)

  • @Balu一点也不.这是我的荣幸. (2认同)