使用 recover() 时类型不匹配错误

Type mismatch ERROR when using recover()

考虑使用 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());
}

"Normal":

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 编译代码没有抱怨。

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



对于其他搜索 -> REASON:

基于 Salem's answer and this 回答:这是一个 Eclipse 错误,与类型推断或其他 < 在这里插入你最喜欢的 Java 抨击>。

有一个bug related to this in Play Framework but from the discussion it seems that this is more a problem of Java than Play itself. The workaround would be something like this (credit to 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(); 也可能有效。