字符串列表上的Scala映射操作的类广播异常

时间:2019-06-21 02:41:50

标签: java scala classcastexception typesafe-config

我有一个类型安全的Config对象,其中包含地图数据类型。以下是conf文件中密钥的内容。

test_mapping = {
'15': [8000, 8002],
'5': [500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522],
....
}

这是我用来从配置读取此密钥的代码。

scala> val test = config.getObject("test_mapping").asScala map { case (cat, et) => (cat -> et.unwrapped().asInstanceOf[java.util.ArrayList[String]].asScala.toList) }
test: scala.collection.mutable.Map[String,List[String]] = Map('15' -> List(8001, 8002), '5' -> List(500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522), '8' -> List(800, 801, 802, 803, 804), '2' -> List(200, 201, 202, 203, 204, 205...

在上面的代码中,我了解我做错了什么,conf文件包含Ints列表,但我使用asInstanceOf强制转换为List [String],但如上所示,它可以正常工作。我不明白的是为什么映射值上的映射函数会因ClassCastException而失败。请参见下面的代码和错误。

scala> test.map( { case(c,e) => e.map(identity) } )
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  at scala.collection.immutable.List.map(List.scala:286)
  at .$anonfun$res105$1(<console>:23)
  at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:237)
  at scala.collection.mutable.HashMap.$anonfun$foreach$1(HashMap.scala:149)
  at scala.collection.mutable.HashTable.foreachEntry(HashTable.scala:237)
  at scala.collection.mutable.HashTable.foreachEntry$(HashTable.scala:230)
  at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:44)
  at scala.collection.mutable.HashMap.foreach(HashMap.scala:149)
  at scala.collection.TraversableLike.map(TraversableLike.scala:237)
  at scala.collection.TraversableLike.map$(TraversableLike.scala:230)
  at scala.collection.AbstractTraversable.map(Traversable.scala:108)
  ... 28 elided

scala>

这与List [_]上的类型擦除有关吗?有人可以解释一下为什么转换为List [String]的第一行有效,但是遍历其元素失败了吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您对擦除的猜测是正确的。

List[Integer]List[String]在运行时具有与JVM完全相同的类型。 这意味着强制转换在运行时实际上不执行任何操作。没事 但是,当您访问列表中的各个元素时,它们将作为字符串进行访问,因为在进行强制转换之后,编译器“知道”这是一个List[String]

现在,JVM实际上验证了类型,您得到了ClassCastException。 这不是Scala特有的,它在Java(和其他类型的JVM语言)中的工作原理相同。