我不明白为什么以下代码无法编译:
private ResponseEntity<JSendResponse> buildResponse(RequestModel requestModel,
RequestModelParamConverter paramConverter,
Supplier<String> xsdSupplier,
Supplier<String> xmlTemplateSupplier) {
return Optional.ofNullable(new RequestErrorHandler<>().validate(validator, requestModel))
.map(validationErrors -> new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST))
.orElse(this.buildResponseForValidRequest(requestModel, paramConverter, xsdSupplier, xmlTemplateSupplier));
}
编译错误:
orElse(org.springframework.http.ResponseEntity
虽然这段代码(我认为逻辑上是相同的代码)确实可以编译:
private ResponseEntity<JSendResponse> buildResponse(RequestModel requestModel,
RequestModelParamConverter paramConverter,
Supplier<String> xsdSupplier,
Supplier<String> xmlTemplateSupplier) {
JSendResponse validationErrors = new RequestErrorHandler<>().validate(validator, requestModel);
if(validationErrors == null) {
return this.buildResponseForValidRequest(requestModel, paramConverter, xsdSupplier, xmlTemplateSupplier);
}
else
{
return new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST);
}
}
问题似乎是RequestErrorHandler
如果我将validationErrors强制转换为映射lambda中的JSendResponse,那么我可以编译它,但随后会丢失JSendFailResponse上的一些字段。
编辑:此代码也无法编译:
private ResponseEntity<? extends JSendResponse> buildResponse(RequestModel requestModel,
RequestModelParamConverter paramConverter,
Supplier<String> xsdSupplier,
Supplier<String> xmlTemplateSupplier) {
return Optional.ofNullable(new RequestErrorHandler<>().validate(validator, requestModel))
.map(validationErrors -> new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST))
.orElse(this.buildResponseForValidRequest(requestModel, paramConverter, xsdSupplier, xmlTemplateSupplier));
}
EDIT2:这是一个简化的示例,您可以将其复制/粘贴到您的IDE中以供自己查看。
import java.util.*;
public class GemLamDemo {
public static void main(String... args) {
GemLamDemo gld = new GemLamDemo();
gld.getList(null);
}
public List<? extends TypeA> getList(TypeA ta) {
return Optional.ofNullable(ta)
.map(a -> new ArrayList<TypeA>(Arrays.asList(a)))
.orElse(new ArrayList<TypeB>(Arrays.asList(new TypeB())));
}
public class TypeA {
}
public class TypeB extends TypeA {
}
}
EDIT3:我想我是根据目前为止收到的帮助来理解这个问题的,但下面的代码已经编译并运行了。
Optional.ofNullable(val1)
.map(a -> new TypeA())
.orElse(new TypeB());
所以问题似乎不是map和orElse必须返回相同的类型,这似乎与参数化有关。所以,map可以发出TypeA,如果它是TypeA的子类,orElse可以发出TypeB。但是它们不能发出不同的参数化类型的List。列表
响应性
编辑4:
上述示例不正确,因为类型是从原始案例切换而来的。我想我现在明白了,谢谢大家。
如果检查oracle文档:https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html,
的签名。of nullable()
方法是:公共静态
和<代码>orElse()
:<代码>公共T orElse(T其他)
所以两个方法类型上的参数都是T
和orElse()
没有
您应该尝试以下内容(使用简化示例):
public List<TypeA> getList(TypeA ta) {
ArrayList<TypeA> typeAinstance = new ArrayList<>();
return Optional.ofNullable(ta)
.map(a -> new ArrayList<TypeA>(Arrays.asList(a)))
.orElse(typeAinstance.getClass().cast(Arrays.asList(new TypeB())));
}
public class TypeA {
}
public class TypeB extends TypeA {
}
希望这能有所帮助
从map()发出的类型推断为JSendFailResponse,但您在orElse()中提供了不同的类型,这两种类型必须一致。
显式键入以使用公共类型调用map():
.<JSendResponse>map(validationErrors -> new ResponseEntity<>(validationErrors, HttpStatus.BAD_REQUEST))
但它匹配和路径没有
问题内容: 如何使用https://www.amcharts.com/demos/line-chart-with-scroll-and- zoom/ 这样的图表 我对这些功能特别感兴趣 为了能够使用这两个选择控件选择域轴窗口。 为了能够通过选择部分域轴进行缩放。 为了能够缩小并查看大图。 为了能够映射到范围轴(Y)并在任意点(无标记)像工具提示一样查看该气球上的值 我在这里尝试了可滚动的JFree
如何拥有像https://www.amcharts.com/demos/line-chart-with-scroll-and-zoom/这样的图表 null 我在这里做了初步尝试,可滚动JFree域轴和自定义标记标签,在垃圾上帝的帮助下,我使域可滚动。 我仍然缺少这些功能,以便能够有效地使用graph。
问题内容: 考虑以下代码段: 控制台输出: 可选([1、4、9、16、25] [75、43、103、87、12] 为什么字典中有“ Optional”? 问题答案: 为了安全起见,Swift字典正在返回可选内容。如果您尝试访问一个不存在的密钥,那将使您无用。 您还可以使用下标语法从字典中检索特定键的值。因为可以请求不存在任何值的键,所以字典的下标返回字典值类型的可选值。如果字典包含所请求键的值,则
这两种方法有什么区别:和? 请举个例子。
我是jQuery/js的新手,遇到了这样的问题:您可以运行我的代码,发现计数不正确: null null 我的HTML必须保持不变,我必须找到一些方法使jQuery在本例中工作,并且保持HTML结构不变。如果您对如何解决此问题有任何想法,请随时发表评论或分享代码想法。 我感谢您的帮助!