1

有没有人有处理这些类型的编译错误的经验?

case class BasicAuthRequest[A](account: Account, request: Request[A]) extends WrappedRequest(request) {
    def asOpt[T](implicit fjs: Reads[T]): Option[T] = {
        catching(classOf[RuntimeException]).opt(fjs.reads(JsNull)).filter {
        case JsUndefined(_) => false
        case _ => true
    } }
}

尝试编译此 playframework 方法时,我从 scala 编译器得到此响应

[error]  found   : play.api.libs.json.JsUndefined
[error]  required: play.api.libs.json.JsResult[?T1] where type ?T1 <: T (this is a GADT skolem)
[error]         case JsUndefined(_) => false
[error]              ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] Total time: 23 s, completed Nov 27, 2012 3:01:20 AM
4

1 回答 1

0

fjs.reads(JsNull) 返回 JsResult[T] 然后由 opt 包装到 Option

所以这段代码有几个问题:

  • 返回类型应该是 Option[JsResult[T]]
  • JsUndefined 不是 JsResult 的子类,所以不能在 match 中使用
  • 编译器错误消息确实很神秘,您介意向 scala tracker 提交问题吗?

这是我认为你试图实现的代码

  case class Account()

  case class BasicAuthRequest[A](account: Account, request: Request[A]) extends WrappedRequest(request) {
    def asOpt[T](implicit fjs: Reads[T]): Option[T] =
      scala.util.control.Exception.catching(classOf[RuntimeException]).opt(fjs.reads(JsNull)).flatMap(_.asOpt)
  }
于 2012-12-08T17:26:25.020 回答