假设我有一个接口Bar
和一个实现类Foo
:
interface Bar { ... }
class Foo implements Bar {
static final Foo X = new Foo();
static final Foo Y = new Foo();
static final Foo[] FOOS = { X, Y };
}
现在假设我有一个类,它包含返回Optional<Bar>
:的方法
public class Fubar {
public Optional<Bar> fromValue() {
return Optional.of(Foo.X); // This is fine
}
public Optional<Bar> fromStreamA() {
Optional<Foo> foo = Arrays.asList(Foo.FOOS).stream().findFirst();
return foo; // This fails to compile
}
public Optional<Bar> fromStreamB() {
Optional<Foo> foo = Arrays.asList(Foo.FOOS).stream().findFirst();
if (foo.isPresent()) {
return Optional.of(foo.get()); // This is also fine
}
return Optional.empty();
}
}
方法fromValue()
编译正确,但fromStreamA()
编译不正确。我收到了一条关于Type mismatch: cannot convert from Optional<Foo> to Optional<Bar>
的错误消息。我在fromStreamB()
(编译正确(中解决了这种不匹配问题。
我很难理解fromStreamA()
为什么不编译。我感觉这与泛型有关,类似于为什么List<Foo>
不能分配给List<Bar>
,但我无法理解。有人能解释为什么fromValue()
好,而fromStreamA()
不好吗。
Optional<Foo>
不能分配给Optional<Bar>
。
另一个例子之所以有效,是因为编译器帮助您推断类型为Bar
,即:
Optional.of(Foo.X)
相当于:
Optional.<Bar>of(Foo.X)
如果你试图明确地告诉编译器推断的类型,它不会接受它:
Optional.<Foo>of(Foo.X); // does not compile