类型不匹配错误使用恢复时()
问题描述:
考虑使用播放框架2.3.8以下2个控制器写:类型不匹配错误使用恢复时()
Java8 lambda表达式:
public static Promise<Result> testLambda() {
final Promise<Boolean> promiseBool = Promise.promise(() -> "TEST".equals("test"));
return promiseBool.map(bool -> ok()).recover(t -> badRequest());
}
“正常”:
public static Promise<Result> test() {
final Promise<Boolean> promiseBool = Promise.promise(new Function0<Boolean>() {
@Override
public Boolean apply() throws Throwable {
return "TEST".equals("test");
}
});
return promiseBool.map(new Function<Boolean, Result>() {
@Override
public Result apply(Boolean bool) throws Throwable {
return ok();
}
}).recover(new Function<Throwable, Result>() {
@Override
public Result apply(Throwable t) throws Throwable {
return badRequest();
}
});
}
使用lambda表达式写控制器给了我这个错误在日食:Type mismatch: cannot convert from F.Promise<Results.Status> to F.Promise<Result>
,而第二个则没有。这仅在使用recover()
函数时发生。
另一方面,sbt编译代码没有抱怨。
问:这究竟是为什么和如何能解决吗?
对于其他人寻找一个 - >原因:
基于Salem's答案,this答案:这是一个Eclipse的错误和无关进行类型推理或其他< 插入你最喜欢的Java扑在这里>。
答
在Play Framework中有一个bug与此相关,但从讨论来看,这似乎更像是一个Java而不是Play本身的问题。解决方法将是这样的(信贷igmar):
return promiseBool.map(new Function<Boolean, Result>() {
@Override
public Result apply(Boolean bool) throws Throwable {
Result res = ok();
return res;
}
}).recover(new Function<Throwable, Result>() {
// Same
});
使用return (Result) ok();
也可以正常工作。
AHHHHH,协方差!谢谢,它的确有用。干杯! – sebster 2015-03-31 10:22:27
如果这样的作品,'布尔 - >(结果)OK()'应该工作为好,不应该吗?但这是我第一次听说Java应该有协变返回类型的问题。我可以理解,如果这是一个Eclipse问题,因为它在Java 8方面存在很多问题,但归咎于Java通常看起来很薄弱。也许这将有助于了解'ok()'方法的来源以及签名的外观如何... – Holger 2015-03-31 11:31:31
确实(结果)ok()也适用。你可能对Java的抨击是正确的......如果我找到了某些东西,将会进行调查并返回一个更新。 – sebster 2015-03-31 15:02:52