4 回答

TA貢獻1883條經(jīng)驗 獲得超3個贊
Function
接口是一個函數(shù)式接口,表示一個接受一個參數(shù)并返回一個值的函數(shù)。
super::equals
之所以有效,是因為它是一個接受一個參數(shù)并返回一個值的函數(shù)。
Object::equals
不起作用,因為它是一個接受兩個參數(shù)并返回一個值的函數(shù)。
如果您有 form 的方法引用,ClassName::instanceMethod
則它表示的函數(shù)將有一個額外的參數(shù) - 調(diào)用該方法的對象。根據(jù)文檔:
方法引用的等效 lambda 表達式
String::compareToIgnoreCase
將具有形式參數(shù) list(String a, String b)
,其中a
和b
是用于更好地描述此示例的任意名稱。方法引用將調(diào)用該方法a.compareToIgnoreCase(b)
super::equals
是形式instance::instanceMethod
,所以沒有問題并且可以按您的預(yù)期工作。
用于Object::equals
和的正確功能接口類型super::hashCode
是BiFunction<Object, Object, Boolean>
和IntSupplier
。
另外,不要使用原始類型。

TA貢獻1852條經(jīng)驗 獲得超1個贊
java.util.Function
是一個接受一個參數(shù)的函數(shù)。
super::equals
是一個接受一個參數(shù)(super
與之比較的對象)的函數(shù),因此它可以工作。Object::equals
是一個接受兩個參數(shù)的函數(shù):目標對象和要比較的對象,因此它不起作用。
同樣,Object::hashCode
是一個參數(shù)的函數(shù),但是super::hashCode
是零參數(shù)的函數(shù)。

TA貢獻1946條經(jīng)驗 獲得超4個贊
當您編寫 時super::methodName
,您正在為類的特定實例創(chuàng)建方法引用。因此,功能接口的方法(您分配此方法引用)必須期望與具有相同數(shù)量的參數(shù)methodName
。
當您編寫ClassName::methodName
, ifmethodName
不是靜態(tài)方法時,您是在類的任意實例上創(chuàng)建方法引用。因此,功能接口的方法(您分配此方法引用)必須期望與 has + 1 相同數(shù)量的參數(shù)methodName
(額外的參數(shù)是將在其上執(zhí)行方法的 ClassName 的實例)。
Function
接受一個參數(shù)并返回一個值。
因此,您可以為其分配特定實例的方法引用和單個參數(shù)方法(如 中super::equals
)或任意實例的方法引用和 0 參數(shù)方法(如中Object::hashCode
)。
但是,您不能為它分配任意實例的方法引用和單個參數(shù)方法(如 中Object::equals
),因為這需要兩個參數(shù),并且Function
只需要一個參數(shù)。
由于需要兩個參數(shù),因此您可以將此方法引用分配給 a BiFunction
:
BiFunction<Object,Object,Boolean> bifunc = Object::equals;
同樣,您不能為其分配特定實例的方法引用和 0 參數(shù)方法(如 中super::hashCode
),因為這需要 0 個參數(shù),并且Function
需要一個。
由于需要 0 個參數(shù),因此您可以將此方法引用分配給 a Supplier
:
Supplier<Integer> sup = super::hashCode;
添加回答
舉報