【问题标题】:Scala convert Map$ to MapScala 将 Map$ 转换为 Map
【发布时间】:2017-07-12 14:15:01
【问题描述】:

我有一个例外:

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`.

提前致谢

【问题讨论】:

  • Map.getClass 是 Map 伴随对象的类。你可能想要classOf[Map[_, _]]
  • $ 符号后面没有什么吗?只是因为Java中的$把内部类和主类分开了……
  • @UsagiMiyamoto :scala 编译器只是在 objects 的类名末尾添加一个美元符号(因此 object MyObject 被编译为名为 MyObject$ 的类)。跨度>
  • @OlegPyzhcov 谢谢,我忘了 classOf 函数。现在我收到 Can not construct instance of scala.collection.immutable.Map: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
  • 上一个错误Can not construct instance of scala.collection.immutable.Map: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information 已通过使用classOf[java.util.Map[_,_]] 解决。

标签: scala jackson


【解决方案1】:

正如在前面的 cmets 中所指出的,一般来说,对于采用两种泛型类型的类,您需要 classOf[X[_,_]] 而不是 X.getClassX[A, B].getClass。 (instance.getClass 检索关联的 instance 的类;classOf[X] 在实例不可用时对某些类型 X 执行相同操作。因为 Map 是一个 object 和对象也是实例,它检索对象 Map 的类类型 - Map trait 的同伴。)

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

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

【讨论】:

    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 2016-07-21
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多