4

我正在编写一个函数来从JSONObject. 由于它是 JSON,输入名称的条目可能存在也可能不存在,因此该函数返回一个Option失败或值成功None时的值。函数编译失败,返回类型不正确。TryNULL

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
}
4

2 回答 2

4

问题在于这一行:

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

在 if/else 语句中同时具有 anOption[Nothing]和 a 。if/else 的结果类型是 的结果类型和 的结果类型T的最小上界(最接近的公共类型)。在这种情况下,它们没有任何共同点,但. 所以结果是转换为by 。ifelseAnyTry[Any]Option[Any]toOption

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

def tryGet[T](jsonObject: JSONObject, name: String): Option[T] =
    Try(jsonObject.get(name))
        .map(_.asInstanceOf[T])
        .filter(_ != null)
        .toOption
于 2015-09-02T01:41:32.897 回答
0

我认为您不需要空值检查,并且“无”和“T”是映射中的两个可能结果,因此该类型将映射到代码中的“任何”而不是“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
于 2015-09-02T01:38:57.383 回答