功能接口在Java8中如何工作
这是我在研究功能接口概念时遇到的一个示例功能接口在Java8中如何工作,java,java-8,functional-interface,Java,Java 8,Functional Interface,这是我在研究功能接口概念时遇到的一个示例 interface Sayable{ void say(); } public class MethodReference { public static void saySomething(){ System.out.println("Hello, this is static method."); } public static void main(String[] args)
interface Sayable{
void say();
}
public class MethodReference {
public static void saySomething(){
System.out.println("Hello, this is static method.");
}
public static void main(String[] args) {
// Referring static method
Sayable sayable = MethodReference::saySomething;
// Calling interface method
sayable.say();
}
}
这是在运行时在输出中打印“你好,这是静态方法”。我的问题是,当我们调用say()方法(未实现)时,它如何打印输出
Sayable sayable = new Sayable() {
@Override
void say() {
// Grab the body of the method referenced by the method reference,
// which is the following:
System.out.println("Hello, this is static method.");
}
}
方法引用有效,因为
- 目标类型是功能接口
(您试图将结果存储到Sayable
类型);及Sayable
- 对
的方法引用的签名与函数接口方法saySomething()
匹配,即参数和返回类型匹配1say()
Sayable
的Sayable
实例的say()
方法的实现等于方法引用引用的方法体
正如JB Nizet在评论中所说,say()
实际上已经实现了
1一个小细节:“匹配”一词并不完全意味着“相等”。例如,如果
saySomething()
返回一个int
,它仍然可以工作,尽管目标类型的唯一方法将返回类型定义为void
,基本上,只有一个抽象方法的接口是函数接口
如果要匿名创建接口对象并调用MethodReference的saySomething()。通常情况下是这样的
Sayable sayable = new Sayable() {
@Override
void say() {
MethodReference::saySomething;
}
}
对于功能接口,因为总是只有一种方法。您可以忽略say()和相关的大括号-这是由lambdas提供的
你可以这么说
Sayable sayable = MethodReference::saySomething;
这仅适用于功能接口。不适用于具有多个抽象方法的接口。它已实现
MethodReference::saySomething
是Sayable的一个实例,其say()
方法由方法saySomething
实现。我发誓,2014年我第一次看到这张照片时,我有着和你现在一样的感觉;但是,当你在阅读更多的文档时,你已经习惯了它,你只需要接受Java的话就可以了Sayable
定义为一种类型a函数,它不接受任何参数,也不返回任何值,因为Java这么说。因为这就是MethodReference::saySomething
的含义,所以可以将其分配给该类型的引用。然后就是你如何处理这样的推荐信。有一个任意的方法名来调用这个函数真的很奇怪。你只需要跟着它走就行了。@JBNizet所有的感谢都将接受给出的答案