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()代码>@ElliottFrischobj1.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();