4

从 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) }
    )
}

我已经解决了这个问题,但我很好奇为什么这会冻结一切。我在运行 java (1.7.0_40) 的 Mac 上。

更新:另外,我使用的是 Scala 2.10.2。我的一个同事可以在他的 PC 上编译它,但在 Async 上有弃用警告。

4

1 回答 1

0

Scala 中有某些表达式,当您要求编译器评估它们时,它会实例化大量类型实例,试图找出两种类型之间的统一差异。最有可能的是,您返回的类型不是您所期望的。

我会明确地注释结果类型:

def foo = Action { implicit request =>
  someForm.bindFromRequest.fold[Result](
    formWithErrors => Ok,
    form => Async { Future.successful(Ok) }
  )
}

这应该有助于类型推断器知道类型是什么,并且只检查它们是否匹配,而不是无限扩展。此外,听起来它可能是一个 scala 编译器错误。

于 2014-07-05T17:02:15.290 回答