java - 有没有办法在函数式接口(interface)中重载抽象方法?

标签 java java-8 overloading functional-interface

我希望能够提供一个接受多种不同类型的 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/

相关文章:

java - 在Java 8中,接口(interface)默认方法可以访问实例变量吗?

java - 如何以函数式风格替换 "return optObj.isPresent() ? new Obj2(optObj) : null"?

python - bin() 可以像 Python 2.6 中的 oct() 和 hex() 那样重载吗?

java - 使用可变参数重载时方法不明确

java - 声明接口(interface)方法仅允许实现的类

java - Android 静态类 vs 非静态类内存性能

java - 如何将 Java 8 Stream 转换为二维数组?

java - 具有自己的数据类型的 map (Java)

java - addMouseMotionListener 获取错误坐标的问题

perl - 为什么 '|' 没有被重载?