3
考虑使用播放框架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扑在这里>。
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