簡體   English   中英

供應商接口中的get()在哪里實現?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM