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