Java 为供应商使用lambda时编译失败<;?扩展类型>;

Java 为供应商使用lambda时编译失败<;?扩展类型>;,java,generics,lambda,java-8,optional,Java,Generics,Lambda,Java 8,Optional,为什么不编译 import java.util.Optional; public class Demo { Optional<? extends SomeValue> getOption() { return Optional.empty(); } void exposure() { SomeValue someValue = getOption().orElseGet(() -> new SomeValue());

为什么不编译

import java.util.Optional;

public class Demo {

    Optional<? extends SomeValue> getOption() {
        return Optional.empty();
    }

    void exposure() {
        SomeValue someValue = getOption().orElseGet(() -> new SomeValue());
    }
}

class SomeValue {}
import java.util.Optional;
公开课演示{

可选
可选。指定OrelGet
接受
供应商这是相当受限的方法签名的结果:

public T orElseGet(Supplier<? extends T> other) {
identity
函数不会更改值,但映射操作允许传入使用更广泛类型的函数,即当实际输入类型为
?extensed SomeValue
且返回类型为
SomeValue
时,映射函数可以声明使用
SomeValue


但一般来说,为了避免此类问题,方法的返回类型中不应包含通配符,因此

Optional<? extends SomeValue> getOption()

Optional基本上,它是一个无法实现的供应商,因为它不可能提供一个实例,该实例是
SomeValue
的每个可能子类的实例。如果您的
Optional
扩展的
,则
或lseget
几乎毫无用处。(尽管您可能返回null或抛出您选择的异常。)
Optional<? extends SomeValue> getOption()
Optional<SomeValue> getOption()