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()