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

我正在尝试学习Lambda表达式

interface MathOperartor

已经为int和float类型重载了operator(),我确定使用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);

}

请让我知道我在这里做错了什么,并提出解决方法…

好的,所以我了解了 的概念,我的问题也是关于实现上述代码中我想做的事情,并且发现了几种实现方法。

感谢您的宝贵回答!

回答:

甲功能接口必须是一个

接口:

功能接口只有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。如果接口声明的抽象方法覆盖了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);

}

以上是 Java 8 Lambda表达式-方法重载疑问 的全部内容, 来源链接: utcz.com/qa/398528.html

回到顶部