从常量创建的Optional的类型与从流创建的不同

  • 本文关键字:创建 Optional 常量 类型 java types
  • 更新时间 :
  • 英文 :


假设我有一个接口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

相关内容

最新更新