假设我有两个类和两个方法:
class Scratch {
private class A{}
private class B extends A{}
public Optional<A> getItems(List<String> items){
return items.stream()
.map(s -> new B())
.findFirst();
}
public Optional<A> getItems2(List<String> items){
return Optional.of(
items.stream()
.map(s -> new B())
.findFirst()
.get()
);
}
}
为什么getItems2
可以编译通过而getItems
会报编译错误?
incompatible types: java.util.Optional<Scratch.B> cannot be converted to java.util.Optional<Scratch.A>
所以,当我使用findFirst
返回的Optional
值,并再次使用Optional.of
进行包装时,编译器会认识到继承关系,但如果我直接使用findFirst
的结果,则无法识别。
Optional<A> a = Optional.of(new B()); Optional<A> b = Stream.of(new B()).findFirst();
。主要原因是Optional.of
的类型通过上下文推断,因为其签名暗示着<T> Optional<T> of(T value)
。 - Naman