Java 可选的map和orElse必须返回相同的类型

Java 可选的map和orElse必须返回相同的类型,java,null,optional,Java,Null,Optional,我有以下代码: Object s = ofNullable(resp).map(ResponseEntity::getBody).orElse(ex.getMessage()); ResponseEntity::getBody returns Object and ex.getMessage returns String 我得到一个编译器错误: The method orElse(capture#10-of ?) in the type Optional<capture#10-of ?&

我有以下代码:

Object s = ofNullable(resp).map(ResponseEntity::getBody).orElse(ex.getMessage());
ResponseEntity::getBody returns Object and ex.getMessage returns String
我得到一个编译器错误:

The method orElse(capture#10-of ?) in the type Optional<capture#10-of ?> is not applicable for the arguments (String)

问题源于Java如何进行类型推断

方法引用(和lambda)是多表达式。这意味着同一表达式可以有不同的类型,具体取决于它的使用位置

因此,您的多表达式:

ofNullable(resp).map(obj1::get1)
有一些类型

如果要在作业上下文中使用它:

Optional<Object> opt1 = ofNullable(resp).map(obj1::get1);
Optional<?> opt2      = ofNullable(resp).map(obj1::get1);
然后Java首先推断出nullable(…).map(…)的
类型(它不再是一个多表达式),然后继续到
orElse

显然,
obj1.get1(resp)
并不像您所说的那样返回
对象,而是某种通配符类型。这是可选的推断类型:
optional
orElse
的参数也必须是
某种通配符的类型;唯一可能的值是
null

有很多方法可以解决这个问题:

  • 您可以显式地将nullable(…).map(…)
结果分配给类型为
Optional
的变量,然后对该变量调用

  • 您可以强制转换到
    可选

    Object s = (resp != null) ? obj1.get(resp) : ex.getMessage();
    
  • 您可以改为使用lambda,并将结果强制转换为
    对象

    ofNullable(...).map(r -> (Object) ...).orElse(...)
    
  • 或者您可以保持简单,而不是尝试使用
    可选的

    Object s = (resp != null) ? obj1.get(resp) : ex.getMessage();
    

    在这里你不需要选择。只需保留您的迭代代码。“obj1::get1返回对象”您确定吗?它似乎返回了
    capture#10 of?
    @AndyTurner我想你是对的,想知道
    s=(resp!=null)的错误是什么?obj1.get1():例如getMessage()@ElliottFrisch
    obj1.get1(resp)
    ,大概是吧。有了它,我看不出会有错误。您可以用两条语句来实现它:
    Optional=ofNullable(resp.map)(obj1::get1);对象s=opt.orElse(msg)
    。最简单的方法是将
    .map(obj1::get1)
    替换为
    .map(obj1::get1)
    ofNullable(...).map(...).map(Object.class::cast)
    
    ofNullable(...).map(r -> (Object) ...).orElse(...)
    
    Object s = (resp != null) ? obj1.get(resp) : ex.getMessage();