我有一个例外:
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`.
提前致谢
答案 0 :(得分:0)
正如之前的评论中指出的那样,对于一个采用两种泛型类型的类,通常需要classOf[X[_,_]]
而不是X.getClass
或X[A, B].getClass
。 (instance.getClass
检索关联的instance
的类; classOf[X]
在某个实例不可用时对某些类型X
执行相同操作。自Map
起是一个对象,对象也是实例,它检索对象的类类型Map
- Map
trait 的伴侣。)
然而,这里的第二个问题是scala.collection.immutable.Map
抽象(它实际上是一个特征),因此无法实例化 as-is 。 (如果您查看通过随播广告Map
方法创建的 Scala apply
实例的类型,您会发现它们实际上是类Map.EmptyMap
或Map.Map1
等类的实例。)因此,这就是为什么修改后的代码仍会产生错误的原因。
然而,这里的最终问题是你需要 - 如你所提到的 - Java java.util.Map
而不是 Scala scala.collections.immutable.Map
(其中默认情况下,您只需在 Scala 程序中输入Map
即可获得。将 Java 代码示例转换为 Scala 时需要注意的另一件事。 ; - )