[英]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.