[英]How the functional interface working in java 8
这是我在研究功能界面概念时遇到的一个例子。
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()
的方法引用的签名与函数接口方法say()
saySomething()
匹配,即参数和返回类型匹配1 。 Sayable
实例的say()
方法的Sayable
称为变量sayable
等于方法引用引用的方法的主体。
就像JB Nizet在评论中所说的那样, say()
实际上已经实现了。
1一点点细节:“匹配”这个词并不完全意味着“相等”。 例如,如果saySomething()
返回一个int
,它仍然可以工作,尽管目标类型的唯一方法将返回类型定义为void
。
基本上只有一个抽象方法的接口是Functional接口。
如果要匿名创建接口对象并调用MethodReference的saySomething()。 通常情况下会是这样的..
Sayable sayable = new Sayable() {
@Override
void say() {
MethodReference::saySomething;
}
}
在功能界面的情况下,因为总是只有一种方法。 你可以忽略say()和相关的括号 - 这是由lambdas提供的。
所以你可以说。
Sayable sayable = MethodReference::saySomething;
这仅适用于功能接口。 不适用于具有多个抽象方法的接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.