为什么 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
,那么它将起作用,因为 String
是 Object
的某个子类型,如下所示。
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");
我在试验时尝试了这一行:
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
,那么它将起作用,因为 String
是 Object
的某个子类型,如下所示。
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");