Scala 选项类型未按预期推断
Scala Option type not inferred as expected
我正在编写一个函数来从 JSONObject
中获取条目。由于它是 JSON 输入名称的条目可能存在也可能不存在,因此函数 return 和 Option
当 Try
失败时将是 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
我正在编写一个函数来从 JSONObject
中获取条目。由于它是 JSON 输入名称的条目可能存在也可能不存在,因此函数 return 和 Option
当 Try
失败时将是 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