我正在写一个函数来从JSONObject
获取一个条目。由于它是JSON,输入名称的条目可能存在也可能不存在,因此当Option
失败或值为{{1时,函数将返回None
Try
成功的。该函数无法编译,错误返回类型错误。
NULL
错误:
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]
答案 0 :(得分:4)
问题在于这一行:
.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]
,Option[Any]
将其转换为toOption
。
如果您确实需要检查null
,请改用filter
。
def tryGet[T](jsonObject: JSONObject, name: String): Option[T] =
Try(jsonObject.get(name))
.map(_.asInstanceOf[T])
.filter(_ != null)
.toOption
答案 1 :(得分:0)
我认为你不需要空检查,并且"无"和" 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