我希望能够提供一个接受多种不同类型的 lambda 函数的函数式接口(interface)。
我读到this 。这个问题的第一个答案阐明了为什么在函数式接口(interface)中重载抽象方法可能会导致未定义的行为。但是,如果我提供所有默认值,是否有办法执行相当于在函数接口(interface)中重载抽象方法的操作?
我希望能够编写如下代码:
Ball b = () -> System.out.println("You hit it!");
Ball ba = (boolean miss) -> System.out.println(miss);
b.hit();
b.hit(false);
ba.hit();
ba.hit(false);
期望的结果是:
You hit it!
default false
default hit
false
考虑以下(不可编译)代码(大部分是从链接的问题复制的):
@FunctionalInterface
public interface Ball
{
void hit();
void hit(boolean miss);
default void hit(){
System.out.println("default hit");
}
default void hit(boolean miss){
System.out.println("default" + miss);
}
}
我正在寻找可以编译的代码的替代方案。
最佳答案
您可以将接口(interface)包装在类中,然后在内部将方法调用传递给接口(interface)。
示例代码:
public class Test{
public static void main(String... args) throws Exception{
Ball b = new Ball(() -> System.out.println("You hit it!"));
Ball ba = new Ball((boolean miss) -> System.out.println(miss));
b.hit();
b.hit(false);
ba.hit();
ba.hit(false);
}
public static class Ball{
final Hit a;
final HitBoolean b;
public Ball(Hit a){
this.a = a;
b = (miss) -> System.out.println("default " + miss);
}
public Ball(HitBoolean b){
this.b = b;
a = () -> System.out.println("default hit");
}
public void hit(){
a.hit();
}
public void hit(boolean miss){
b.hit(miss);
}
}
public interface Hit{
void hit();
}
public interface HitBoolean{
void hit(boolean miss);
}
}
程序的输出:
You hit it!
default false
default hit
false
关于java - 有没有办法在函数式接口(interface)中重载抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56382768/