本文介紹了方法引用表達式為&Quot;Exact&Quot;的條件的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
考慮JLS的以下文章(§15.13.1)
如果以標識符結尾的方法引用表達式滿足以下所有條件,則它是精確的:
如果方法引用表達式具有ReferenceType::[TypeArguments]標識符格式,則ReferenceType不表示原始類型。
要搜索的類型正好有一個成員方法,其名稱標識符可由出現方法引用表達式的類或接口訪問。
此方法不是變量(§8.4.1)。
如果此方法是泛型的(§8.4.4),則方法引用表達式提供
類型參數。
考慮以下代碼片段:
class Scratch {
public static void main(String[] args) {
Scratch.funct(new ImplementingClass()::<Functional1>hitIt);
}
public static void funct(Functional1 a){}
public static void funct(Functional2 a){}
}
interface Functional1 {<T> T hitIt();}
interface Functional2 {<T> T hitIt();}
class ImplementingClass{
public <T> T hitIt(){return null;}
}
顯然-這滿足所提到的使方法引用準確的所有條件。
不確定為什么在這種特定情況下方法引用仍然不準確?我在子句中遺漏了什么嗎?
解決方案:
根據@Sweeper@DidierL和@Holger的輸入,我總結如下:
-
兩個功能接口都有unctionType
<T> () -> T
方法引用
…::<Functional1>hitIt
將T
替換為Functional1
,因此得到的函數簽名為() -> Functional1
,與<T> () -> T
不匹配。
推薦答案
首先警告:iANAJL(用于JAVA