java 8 中的功能接口如何工作
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();
}
}
它在运行时在输出中打印 "Hello, this is static method."。我的问题是当我们调用 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()
,即参数和 return类型匹配1.
Sayable
实例的say()
方法的实现引用变量sayable
等于方法体方法引用指的是.
就像 JB Nizet 在评论中所说的那样,say()
实际上 是 实施的。
1 一点细节:单词 'match' 并不完全意味着 'are equal'。例如。如果 saySomething()
return 编辑了 int
,它仍然有效,尽管目标类型的唯一方法将 return 类型定义为 void
.
基本上只有一个抽象方法的接口是函数式接口。
如果你想匿名创建接口对象,调用MethodReference的saySomething()。在正常情况下它会是这样的..
Sayable sayable = new Sayable() {
@Override
void say() {
MethodReference::saySomething;
}
}
在函数式接口的情况下,因为总是只有一种方法。您可以忽略 say() 和相关的大括号 - 这是由 lambdas 提供的。
所以你可以说.
Sayable sayable = MethodReference::saySomething;
这仅适用于功能接口。不适用于具有多个抽象方法的接口。
这是我 运行 在研究功能接口概念时遇到的一个例子。
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();
}
}
它在运行时在输出中打印 "Hello, this is static method."。我的问题是当我们调用 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()
,即参数和 return类型匹配1.
Sayable
实例的say()
方法的实现引用变量sayable
等于方法体方法引用指的是.
就像 JB Nizet 在评论中所说的那样,say()
实际上 是 实施的。
1 一点细节:单词 'match' 并不完全意味着 'are equal'。例如。如果 saySomething()
return 编辑了 int
,它仍然有效,尽管目标类型的唯一方法将 return 类型定义为 void
.
基本上只有一个抽象方法的接口是函数式接口。
如果你想匿名创建接口对象,调用MethodReference的saySomething()。在正常情况下它会是这样的..
Sayable sayable = new Sayable() {
@Override
void say() {
MethodReference::saySomething;
}
}
在函数式接口的情况下,因为总是只有一种方法。您可以忽略 say() 和相关的大括号 - 这是由 lambdas 提供的。
所以你可以说.
Sayable sayable = MethodReference::saySomething;
这仅适用于功能接口。不适用于具有多个抽象方法的接口。