鉴于以下代码,有人可以解释为什么断言返回 true 吗?尽管进行了无数次搜索,但我无法得到任何适当的答案来说明为什么会出现这种情况,以及 Java 功能导致这种行为的原因以及在类似地创建这样的接口(interface)时我会有哪些限制/要求像这样。
interface X {
default int foo() {return 1;}
String bar();
}
public class Exercise{
public static void main(String[]arg){
X foo1=()->"hello";
assert (foo1.bar()).equals("hello");
}
}
最佳答案
lambda 表达式是一种创建函数接口(interface)实例的简洁方法,该接口(interface)是具有一个抽象方法的接口(interface)。在这里,X
是一个函数式接口(interface),带有抽象方法bar()
.您可以通过以下方式实现 X:
class XImpl implements X {
public String bar() { return "Foo"; }
}
X instance = new XImpl();
或匿名类X anon = new X() {
public String bar() { return "foo"; }
};
或 lambdaX lambda = () -> "foo";
这些中的每一个都实例化了 X
的实现。 .可能让您感到困惑的是 lambda 的简洁性;因为X
只有一个抽象方法,bar
,您不必说您正在实现 bar
-- 编译器算出来了。由于bar()
不带参数并返回 String
,编译器确保 lambda 的形状与唯一抽象方法的形状兼容。因为
X
有一个 bar()
方法,您可以在以下每个实例上调用它:
String s1 = instance.bar();
assertEquals(s1, "hello");
String s2 = anon.bar();
assertEquals(s2, "hello");
String s3 = lambda.bar();
assertEquals(s3, "hello");
你会得到相同的结果。
关于Java 函数式接口(interface)和 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63035160/