Scala选项类型未按预期推断

时间:2015-09-02 01:22:25

标签: scala scala-option

我正在写一个函数来从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]

2 个答案:

答案 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