Ksh*_*rma 4 java lambda casting java-8 method-reference
public class Main {
interface Capitalizer {
public String capitalize(String name);
}
public String toUpperCase() {
return "ALLCAPS";
}
public static void main(String[] args) {
Capitalizer c = String::toUpperCase; //This works
c = Main::toUpperCase; //Compile error
}
}
Run Code Online (Sandbox Code Playgroud)
两者都是具有相同签名的实例方法.为什么一个工作而另一个不工作?
签名String::toUpperCase
:String toUpperCase();
小智 6
有3个构造引用方法:
object::instanceMethod
Class::staticMethod
Class::instanceMethod
这条线:
Capitalizer c = String::toUpperCase; //This works
Run Code Online (Sandbox Code Playgroud)
使用3'rd构造 - Class::instanceMethod
.在这种情况下,第一个参数成为方法的目标.此构造与以下Lambda等效(翻译):
Capitalizer = (String x) -> x.toUpperCase();
Run Code Online (Sandbox Code Playgroud)
此Lambda表达式有效,因为Lambda 作为参数获取String
并返回String
结果 - 根据Capitalizer
接口的要求.
这条线:
c = Main::toUpperCase; //Compile error
Run Code Online (Sandbox Code Playgroud)
翻译为:
(Main m) -> m.toUpperCase();
Run Code Online (Sandbox Code Playgroud)
哪个不适用于Capitalizer
界面.您可以通过更改Capitalizer
为:
interface Capitalizer {
public String capitalize(Main name);
}
Run Code Online (Sandbox Code Playgroud)
这个改变之后Main::toUpperCase
会编译.
归档时间: |
|
查看次数: |
1756 次 |
最近记录: |