2 回答

TA貢獻1829條經驗 獲得超6個贊
你可以這樣想方法引用:
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(),即參數和返回類型匹配1。
被稱為變量say()的實例的方法的實現等于方法引用所引用的方法的主體。Sayablesayable
所以就像 JB Nizet 在評論中所說的那樣,say()實際上已經實現了。
1一個小細節:“匹配”這個詞并不完全意味著“相等”。例如,如果saySomething()
返回一個int
,它仍然可以工作,盡管目標類型的唯一方法將返回類型定義為void
。

TA貢獻1873條經驗 獲得超9個贊
基本上只有一個抽象方法的接口是功能接口。
如果要匿名創建接口對象并調用 MethodReference 的 saySomething()。正常情況下會是這樣。。
Sayable sayable = new Sayable() {
@Override
void say() {
MethodReference::saySomething;
}
}
在功能接口的情況下,因為總是只有一種方法。您可以忽略 say() 和相關的大括號 - 這是由 lambdas 提供的。
所以你可以說。
Sayable sayable = MethodReference::saySomething;
這僅適用于功能接口。不適用于具有多個抽象方法的接口。
添加回答
舉報