使用Lambda表达式覆盖默认方法

7
给定一个带有默认方法的简单接口:
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表达式进行重写?


1
请问您能发布一下 A 接口吗? - randers
私有接口A {默认void hello(){System.out.println("A");}} - T4l0n
你能把你遇到的错误贴出来吗? - user902383
尝试在你的接口上放置@FunctionalInterface注释。你会发现你得到了一个编译器错误。一个函数式接口必须有一个且仅有一个抽象方法(默认方法不是抽象的)。 - scottb
在“print()”中,我有“DefTest.A方法在DefTest类型中不适用于参数(() - > {})”,其中DefTest是类名,在lambda参数中,“此表达式的目标类型必须是一个函数接口”。 - T4l0n
2个回答

9
不行,因为你的接口没有仅有一个未实现的方法(lambda可以提供实现)。
请参见@FunctionalInterface

1

在Lambda中,不允许覆盖默认方法。这是一种有意的设计选择,因为它允许函数接口(可以通过Lambda实例化的接口)具有一个或多个默认方法。

为了成功地通过Lambda实例化A,您不能对hello()有一个默认定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接