Scala将Map $转换为Map

时间:2017-07-12 14:15:01

标签: scala jackson

我有一个例外:

  

java.lang.ClassCastException:scala.collection.immutable.Map $不能   被强制转换为scala.collection.immutable.Map

我在这部分代码中得到了:

 val iterator = new CsvMapper()
  .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
  .readerFor(Map.getClass).`with`(CsvSchema.emptySchema().withHeader()).readValues(reader)

while (iterator.hasNext) {
  println(iterator.next.asInstanceOf[Map[String, String]])
}

那么,有没有选择可以避免这个问题,因为:

val iterator = new CsvMapper()
  .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
  .readerFor(Map[String,String].getClass).`with`(CsvSchema.emptySchema().withHeader()).readValues(reader)

没有帮助,因为我得到了

[error] Unapplied methods are only converted to functions when a function type is expected.
[error] You can make this conversion explicit by writing `apply _` or `apply(_)` instead of `apply`.

提前致谢

1 个答案:

答案 0 :(得分:0)

正如之前的评论中指出的那样,对于一个采用两种泛型类型的类,通常需要classOf[X[_,_]]而不是X.getClassX[A, B].getClass。 (instance.getClass检索关联的instance的类; classOf[X]在某个实例不可用时对某些类型X执行相同操作。自Map起是一个对象,对象也是实例,它检索对象的类类型Map - Map trait 的伴侣。)

然而,这里的第二个问题是scala.collection.immutable.Map 抽象(它实际上是一个特征),因此无法实例化 as-is 。 (如果您查看通过随播广告Map方法创建的 Scala apply实例的类型,您会发现它们实际上是类Map.EmptyMapMap.Map1等类的实例。)因此,这就是为什么修改后的代码仍会产生错误的原因。

然而,这里的最终问题是你需要 - 如你所提到的 - Java java.util.Map而不是 Scala scala.collections.immutable.Map(其中默认情况下,您只需在 Scala 程序中输入Map即可获得。将 Java 代码示例转换为 Scala 时需要注意的另一件事。 ; - )