从Play Framework 2.1转换到2.2(Scala)我正在重构一些代码并找到一些代码行来完全冻结SBT构建,直到该进程因java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
而被终止。 Eclipse(尝试使用Juno和Kepler,但我怀疑它与此有什么关系)冻结了,它甚至不再加载工作台了。
所以,这是代码。我很想知道是什么让编译器冻结,而不仅仅是在这里给出错误。
def foo = Action { implicit request =>
someForm.bindFromRequest.fold(
formWithErrors => Ok,
form => Async { Future.successful(Ok) }
)
}
我已经解决了这个问题,但我很好奇为什么这会冻结一切。我在Mac上运行java(1.7.0_40)。
更新:此外,我正在使用Scala 2.10.2。我的同事可以在他的电脑上编译,但在Async上有弃用警告。
答案 0 :(得分:0)
Scala中有一些表达式,当你要求编译器对它们进行评估时,它会实例化一个类型实例的TON,试图找出两种类型之间的统一差异。最有可能的是,您返回的类型并非您所期望的类型。
我会明确注释结果类型:
def foo = Action { implicit request =>
someForm.bindFromRequest.fold[Result](
formWithErrors => Ok,
form => Async { Future.successful(Ok) }
)
}
这应该有助于类型推断器知道类型是什么,只检查它们是否匹配,而不是无限扩展。此外,听起来它可能是一个scala编译器错误。