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 には特定の式があり、コンパイラにそれらを評価するように要求すると、型インスタンスの TON をインスタンス化して、2 つの型の統一された違いを見つけようとします。ほとんどの場合、返される型は期待したものではありません。

結果の型に明示的に注釈を付けます。

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

これは、型推論者が型が何であるかを認識し、無限に展開するのではなく、それらが一致するかどうかのみを確認するのに役立ちます。また、scala コンパイラのバグだったようです。

于 2014-07-05T17:02:15.290 に答える