Scala 选项类型未按预期推断

Scala Option type not inferred as expected

我正在编写一个函数来从 JSONObject 中获取条目。由于它是 JSON 输入名称的条目可能存在也可能不存在,因此函数 return 和 OptionTry 失败时将是 None或者如果成功时值为 NULL。该函数无法编译并且错误 return 类型不正确。

def tryGet[T](jsonObject: JSONObject, name: String): Option[T] = {
  Try(jsonObject.get(name))
    .map(x => if(JSONObject.NULL.equals(x)) None else x.asInstanceOf[T])
    .toOption
}

错误:

Expression of type Option[Any] doesn't conform to expected type Option[T]

有人可以告诉我我做错了什么吗?另外,这是解决问题的惯用方法吗?

更新:

改成下面的作品

def tryGet[T](jsonObject: JSONObject, name: String): Option[T] = {
    Try(jsonObject.get(name))
      .filter(!JSONObject.NULL.equals(_))
      .map(_.asInstanceOf[T])
      .toOption
}

我认为您不需要空值检查,"None" 和 "T" 是映射中的两个可能结果,因此类型将映射到 Any 而不是 "T" 在你的代码中。检查这个:

Try(jsonObject.get(name)).map( _.asInstanceOf[T]).toOption

那么你可能需要这样的东西:

val NullJson:Option[T] = None
Try(jsonObject.get(name)).map( x=>if(x.equals(null)) NullJson else Option(x.asInstanceOf[T])).toOption.flatten

这一行有问题:

.map( x => if(x.equals(null)) None else x.asInstanceOf[T])
This has type `Option[Nothing]` ^         ^ This has type `T`

您在 if/else 语句中同时具有 Option[Nothing]T。 if/else的结果类型是if的结果类型和else的结果类型的最小上界(最接近的公共类型)。在这种情况下,它们除了 Any 之外没有任何共同点。所以结果是 Try[Any]toOption.

转换为 Option[Any]

如果您确实需要检查 null,请改用 filter

def tryGet[T](jsonObject: JSONObject, name: String): Option[T] =
    Try(jsonObject.get(name))
        .map(_.asInstanceOf[T])
        .filter(_ != null)
        .toOption