[英]Where is get() in Supplier interface implemented?
我有這段代碼
public <T> someMethod(Supplier<T> supplier) {
Objects.requireNonNull(supplier);
SupplierThrowsException<T, Throwable> supplierThrowsException = supplier::get;
return withThrowable(supplierThrowsException);
}
我這樣稱呼它
obj.someMethod(() -> myMethod(message))
我100%確定myMethod()
返回的對象的類未實現Supplier接口。 那么get()
的實現在哪里。
我通過了Javadoc,但一無所獲。 我想了解這里發生了什么。
在此通話中:
obj.someMethod(() -> myMethod(message))
您正在使用lambda表達式- () -> myMethod(message)
來實現Supplier
接口。
就好像您創建了一個內部類來實現Supplier
的內部類一樣(我說“好像”,因為這不是實際發生在幕后。 這是實際發生在幕后):
static class MyInnerClass implements Supplier<SomeClass> {
public SomeClass get() {
return myMethod(message);
}
}
然后將new MyInnerClass()
傳遞給someMethod
。
我100%確定
myMethod()
返回的對象的類未實現Supplier
接口。
可以,但是表達式() -> myMethod(message)
可以。
請閱讀15.27.4。 Lambda表達式的運行時評估 。
在運行時,只要正常完成生成對對象的引用,對lambda表達式的求值就類似於對類實例創建表達式的求值。 Lambda表達式的計算與Lambda主體的執行不同。
分配並初始化具有以下屬性的類的新實例,或者引用具有以下屬性的類的現有實例 。
lambda表達式的值是對具有以下屬性的類的實例的引用 :
- 該類實現目標功能接口類型 ,如果目標類型是路口類型,則實現路口中提到的所有其他接口類型。
簡而言之,lambda表達式() -> myMethod(message)
將解析為Supplier
的實例。
get
()的實現在哪里?
您已在lambda主體中提供了它。
() -> myMethod(message)
(這是一個語句表達式,是構造lambda主體的較短形式)
() -> {
return myMethod();
}
(這是一個值兼容的塊,是一個更擴展的版本,可以在其中聲明許多語句)
我認為該文檔可能會闡明您的問題: https : //docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#target-typing
為了確定lambda表達式的類型,Java編譯器使用找到lambda表達式的上下文或情況的目標類型。 因此,您只能在Java編譯器可以確定目標類型的情況下使用lambda表達式:
變量聲明
作業
退貨聲明
數組初始化器
方法或構造函數參數
Lambda表達體
條件表達式,?:
轉換表達式
Supplier
是一個功能接口,包含以下單個抽象方法:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
現在,您通過以下調用提供了get
方法的definition
以及instantiation
:
obj.someMethod(() -> myMethod(message))
上面的行翻譯如下:
obj.someMethod(new Supplier() {
@Override
public T get()
{
return myMethod(message);
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.