我使用 Jackson 进行JSON反序列化到Map[String,Any]
。杰克逊试图根据它在JSON中看到的内容来推断我的数字类型。这样做的问题是,有时我会收到Long
,有时我会Int
获取Long
,具体取决于值的实际大小。
我无法尝试编写一种方法,无论是Long
还是Int
,都可以将该值转换为Long
。 。我一直在取消装箱时遇到错误,因为如果没有提前知道它是Int
还是Long
,我似乎无法找到将其投放到def getIntOrLongAsLong[T: Manifest](item: Option[T], default:Long): Long = {
if(item == None)
default
else {
val result = item.get
result.asInstanceOf[Long]
}
}
无论如何。
我正在尝试这个:
item.get
我希望通过将val
分配到{{1}},它会在那里取消装箱,但它似乎并非如此。我已经看到人们使用模式匹配来做类似的事情,但我仍然不知道在哪里/如何进行演员表。
答案 0 :(得分:1)
您可以尝试模式匹配,如下所示:
def getIntOrLongAsLong[T: Manifest](item: Option[T], default:Long): Long = item match{
case None => default
case Some(x:Int) => x.toLong
case Some(x:Long) => x
case _ => default
}
scala> getIntOrLongAsLong(Some('a'), 5L)
res0: Long = 5
scala> getIntOrLongAsLong(Some(1), 5L)
res2: Long = 1
scala> getIntOrLongAsLong(Some(1000000000L), 5L)
res3: Long = 1000000000
答案 1 :(得分:1)
您还可以使用Integral
类型类:
import scala.math.Numeric._
def getIntOrLongAsLong[T](item: Option[T], default: Long)
(implicit num: Integral[T]): Long = {
item.map(n => num.toLong(n)).getOrElse(default)
}
这也适用于其他整数类型:
getIntOrLongAsLong(Some(5L), 42L) // == 5L
getIntOrLongAsLong(Some(3), 42L) // == 3L
getIntOrLongAsLong(None: Option[Int], 42L) // == 42L
getIntOrLongAsLong(Some(3:Short), 42L) // == 3L