4 回答

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

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

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