为什么实例方法引用适用于不匹配的签名?
Why does an instance method-reference work for mismatching signatures?
所以我早些时候做了一些编码,发现一个函数的签名只接受 Function<FooClass, String>
,我可以为 FooClass 的函数传递一个方法来生成一个字符串(见下面的例子)。
所以我发现 java 支持它,我的意思是..它可以编译,而且我找到了一篇文章 describing the feature here
public static class Foo {
public String produceString() {
return "Hello world!";
}
}
public static String test(Function<Foo, String> produceString) {
return produceString.apply(new Foo());
}
public static void main(String[] args) {
// WEIRD CODE BELOW!! Here's the method reference:
String output = test(Foo::produceString);
System.out.println(output);
// Outputs "Hello world!"
}
我的问题是:java 到底是怎么做到的!?
有人能解释一下为什么 这行得通吗?
您可以将方法引用作为语法糖来创建相应的 lambda 表达式:
String output = test(Foo::produceString);
鉴于produceString
是一个实例方法,上面的表达式等价于
String output = test( (Foo foo) -> foo.produceString() );
所以我早些时候做了一些编码,发现一个函数的签名只接受 Function<FooClass, String>
,我可以为 FooClass 的函数传递一个方法来生成一个字符串(见下面的例子)。
所以我发现 java 支持它,我的意思是..它可以编译,而且我找到了一篇文章 describing the feature here
public static class Foo {
public String produceString() {
return "Hello world!";
}
}
public static String test(Function<Foo, String> produceString) {
return produceString.apply(new Foo());
}
public static void main(String[] args) {
// WEIRD CODE BELOW!! Here's the method reference:
String output = test(Foo::produceString);
System.out.println(output);
// Outputs "Hello world!"
}
我的问题是:java 到底是怎么做到的!?
有人能解释一下为什么 这行得通吗?
您可以将方法引用作为语法糖来创建相应的 lambda 表达式:
String output = test(Foo::produceString);
鉴于produceString
是一个实例方法,上面的表达式等价于
String output = test( (Foo foo) -> foo.produceString() );