我正在尝试将java.util.Map转换为Map [String,Any]。我将java地图作为我的java界面的一部分。
我遇到了将Integer转换为Int和java.lang.Long转换为scala.Long的问题。
代码如下:
vendorcost
最后两行的结果是:
import java.math.{BigDecimal => JavaBigDecimal}
import scala.collection.JavaConverters.mapAsScalaMapConverter
import scala.collection.mutable
val input = new java.util.HashMap[String, Object]()
input.put("test", Integer.valueOf(1))
input.put("test2", new JavaBigDecimal("12"))
val scalaMap = input.asScala
//noinspection ScalaStyle
val filter: mutable.Map[String, Object] = scalaMap.filter(_._2 != null)
val toMap: Map[String, Any] = filter.toMap
val initialContext = toMap.mapValues {
case b: JavaBigDecimal => BigDecimal(b)
case i: Integer => Integer2int(i)
case l: java.lang.Long => l.toLong
case a: Any if a == null => None
case a: Any if a != null => a
}
initialContext.get("test").get.getClass
initialContext.get("test2").get.getClass
BigDecimal做了我期望它做的事,但是Int(以及Long),不做。它似乎神奇地转换回整数。此外,当我只是添加一个不同的静态数字时:
res3: Class[?0] = class java.lang.Integer
res4: Class[?0] = class scala.math.BigDecimal
它将把它变成一个整数
我需要这个类信息,因为我的java API更深入,我会检查期望的类型是否与gotten类型匹配,而Int(期望的)与Integer不匹配。
答案 0 :(得分:3)
部分功能
{
case b: JavaBigDecimal => BigDecimal(b)
case i: Integer => Integer2int(i)
case l: java.lang.Long => l.toLong
case a: Any if a == null => None
case a: Any if a != null => a
}
返回Any
。但是这种类型实际上并不存在于JVM上;相反,Scala编译器使用Object
。所以原始类型是自动装箱的:Int
到java.lang.Integer
,Long
到java.lang.Long
等等。
我需要这个类信息,因为我的java API更深入,我会检查期望的类型是否与gotten类型匹配,而Int(期望的)与Integer不匹配。
使用盒装类型进行比较,或将所需类与Map[String, (Any, Class[_])]
中的值一起存储。