考慮以下來自 JLS 的文章,該文章描述了型別推斷程序中 MethodReference 運算式的簡化程序:
?MethodReference → T? 形式的約束公式,其中 T 提到至少一個推理變數,簡化如下:
...
否則,如果方法參考是準確的(第 15.13.1 節),則令 P1, ..., Pn 為 T 的函式型別的引數型別,令 F1, ..., Fk 為 T 的引數型別可能適用的方法。約束簡化為一組新的約束,如下所示:
– 在 n = k 1 的特殊情況下,型別 P1 的引數將充當呼叫的目標參考。方法參考運算式必須具有 ReferenceType :: [TypeArguments] Identifier 的形式。約束簡化為?P1 <: ReferenceType?,并且對于所有i (2 ≤ i ≤ n),?Pi → Fi-1?。
在所有其他情況下,n = k,并且對于所有 i (1 ≤ i ≤ n),約束簡化為 ?Pi → Fi?。
在這里,我想知道一些示例案例,說明如何在條款中假設和擬合以下內容:
- 泛型函式型別
- 泛型型別別(其方法將用作參考)
- 通用方法型別(將用作參考)
例如 - 以下是我根據解釋提出的問題:
P1, ..., Pn是T 的函式型別的引數型別,讓F1, ..., Fk是潛在適用方法的引數型別。- 在這里,我假設形成的形狀如下:
FunctionType<P1,P2 ... Pn> funType = ClassCls::MethodRef;
...
class ClassCls {
...
public static <F1, ..., Fk> RetType potentiallyApplicbMethod(...){}
}
- 現在當我們處理
n=k 1- 為什么FunctionType的引數數量會比
potentiallyApplicbMethod? - 為什么是
P1 is to act as the target reference of the invocation?我猜這里 P1 被假定為回傳型別 (RetType) 的potentiallyApplicbMethod?
- 為什么FunctionType的引數數量會比
- 對于這種情況
n=k- 我假設這是在FunctionType中指定的所有型別(可能包括也可能不包括回傳型別)與為
potentiallyApplicbMethod?指定的所有型別完全匹配時給出的。
- 我假設這是在FunctionType中指定的所有型別(可能包括也可能不包括回傳型別)與為
uj5u.com熱心網友回復:
為什么會有
FunctionType比potentiallyApplicbMethod?
有不同形式的方法參考。其中一種形式是ReferenceType::InstanceMethod,或者正如Java 教程所稱,“對特定型別的任意物件的實體方法的參考”。
例子:
public class Main {
public static void main(String[] args) {
// this is a "reference to an instance method of an arbitrary object of a particular type"
BiConsumer<Main, String> bar = Main::foo;
}
private <T> void foo(T t) {
}
}
顯然,函式型別BiConsumer有 2 個引數,但foo只有一個。函式型別的額外第一個引數是必需的,因為您需要一個實體來呼叫foo,而我們沒有在方法參考中指定該實體Main::foo。bar.accept(new Main(), "foo")與呼叫相同new Main().foo("foo")。這就是 JLS 所指的“目標參考”——它是您呼叫該方法的物件。它與回傳型別無關。
現在您也應該能夠看到為什么 JLS 說 n=k 1 情況下的方法參考必須是形式ReferenceType :: [TypeArguments] Identifier,而不是,說,Primary :: [TypeArguments] Identifier。
對于 n=k 的情況,我假設這是在指定的所有型別
FunctionType與為潛在應用程式方法指定的所有型別完全匹配時給出的?
不,這種情況只是指其他型別的方法參考:
- 參考靜態方法
- 參考特定物件的實體方法
- 參考類或陣列的建構式
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437860.html
上一篇:流中的Java泛型
