2015-03-31 44 views
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扑在这里>。

回答

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();也可以正常工作。

+0

AHHHHH,协方差!谢谢,它的确有用。干杯! – sebster 2015-03-31 10:22:27

+1

如果这样的作品,'布尔 - >(结果)OK()'应该工作为好,不应该吗?但这是我第一次听说Java应该有协变返回类型的问题。我可以理解,如果这是一个Eclipse问题,因为它在Java 8方面存在很多问题,但归咎于Java通常看起来很薄弱。也许这将有助于了解'ok()'方法的来源以及签名的外观如何... – Holger 2015-03-31 11:31:31

+0

确实(结果)ok()也适用。你可能对Java的抨击是正确的......如果我找到了某些东西,将会进行调查并返回一个更新。 – sebster 2015-03-31 15:02:52