使用lambdas覆盖默认方法

时间:2016-01-20 15:34:32

标签: java lambda

给定一个带默认方法的简单接口:

private interface A {
    default void hello() {
        System.out.println("A");
    }
}

接受其实例的方法:

private static void print(A a) {
    a.hello();
}

我可以使用匿名类覆盖它:

print(new A() {
    @Override
        public void hello() {
        System.out.println("OverHello");
    }
});

但如果我尝试使用lambda print(() -> System.out.println("OverHello2"));,我会收到编译错误。

  

找不到目标方法

有没有办法用lambda进行覆盖?

2 个答案:

答案 0 :(得分:8)

不,因为你的界面没有一个未实现的方法(lambda可以提供实现)。

请参阅@FunctionalInterface

答案 1 :(得分:0)

Lambdas不允许覆盖默认方法。这是一个有意的设计选择,因为它允许功能接口(可以通过lambda实例化的接口)具有一个或多个默认方法。

要成功允许通过lambda实例化A,您不能拥有t2的默认定义。