繁体   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