为什么 Optional.empty().orElse("test") 不起作用?

Why doesn't Optional.empty().orElse("test") work?

我在试验时尝试了这一行:

String test = Optional.empty().orElse("test");

——令我惊讶的是它给出了一个类型错误:incompatible types: Object cannot be converted to String.

这是为什么?查看源代码,如果可选项为空,orElse 应该只是 return 传入的内容,它在这里。那我错过了什么?另一方面,这很好用:

String test = Optional.of("me").orElse("test");

好吧,这是一个与泛型相关的问题。如果你看一下 empty() 静态方法,它是一个泛型方法并且有一个类型变量。如果你只是调用 Optional.empty 那么类型变量 T 被认为是 Object 并且你有不兼容的类型。 Optional 的类型为 Optional<Object>,它将分配一个 Object,而不是 String。要解决此问题,您必须通过显式传递类型参数来帮助编译器。这是解决方法。

String test = Optional.<String> empty().orElse("test");

但是,如果您的目标类型是 Object,那么它将起作用,因为 StringObject 的某个子类型,如下所示。

Object test = Optional.empty().orElse("test");

Optional.empty() returns 一个 Optional<Object>,然后用字符串“填充”它。所以orElse的return类型已经确定为Object,不管你传入的是一个字符串作为参数。

如果你想创建一个空的 Optional<String> 你可以指定类型:

String test = Optional.<String> empty().orElse("Test");

或者,如果您想要自动输入,可以分两步完成:

Optional<String> opt = Optional.empty();
String test = opt.orElse("test");