Java8通用拼图

Hen*_*yen 7 java generics optional java-8

我正在使用Java 1.8.0_151并且有一些代码无法编译,我不明白:

Optional optional = Optional.of("dummy"); 
Optional<Boolean> result1 = optional.map(obj -> true);     // works fine
boolean result2 = result1.orElse(false);                   // works fine
boolean result3 = optional.map(obj -> true).orElse(false); // compilation error: Incompatible types: required boolean, found object
Object result4 = optional.map(obj -> true).orElse(false); // works fine
Run Code Online (Sandbox Code Playgroud)

为什么它工作正常,result1但给出编译错误result3
附加信息:

  • 在第一行,当我改变OptionalOptional<String>,result3也能够编译
  • 当我result3分成2行:喜欢result1result2,result3能够编译

Eug*_*ene 9

一旦你失去了类型的安全性 - 它也会因链式通话而丢失.那是Optional<Object> != Optional.所以,当你这样做

 Optional optional = Optional.of("dummy");
 optional.map()
Run Code Online (Sandbox Code Playgroud)

map只能接受一个原始Function,没有别的,它会返回一个Object明显.

正确的方法是添加类型信息:

Optional<String> optional = Optional.of("dummy");
Run Code Online (Sandbox Code Playgroud)

或者你可以不安全地投射:

boolean result3 = (boolean) optional.map(obj -> true).orElse(false)
Run Code Online (Sandbox Code Playgroud)