使用recover()时键入不匹配错误

时间:2015-03-31 09:37:40

标签: java playframework lambda java-8 playframework-2.3

考虑使用 Play Framework 2.3.8 编写的以下2个控制器:

Java8 lambdas:

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();
        }
    });
}

使用lambdas编写的控制器在eclipse中给出了这个错误:Type mismatch: cannot convert from F.Promise<Results.Status> to F.Promise<Result>而第二个没有。只有在使用recover()函数时才会发生这种情况。

另一方面, sbt 无需抱怨即可编译代码。

问题:为什么会发生这种情况?如何解决?



对于寻找a - &gt;的其他人的原因:

基于Salem's回答和this回答:这是 Eclipse错误 ,与类型推断或其他&lt; <无>有关。 在此处插入您最喜欢的Java抨击&gt;。

1 个答案:

答案 0 :(得分:2)

在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();也可以。