scala.Some 无法转换为 scala.collection.immutable.Map 异常

scala.Some cannot be cast to scala.collection.immutable.Map Exception

我是 scala 新手,

val data = Map("test" -> data1, 
               "cat" -> None, 
               "myList" -> Map("test2" -> data2, "test3" -> data3))

val output = data.map(x => 
      if (x._2.isInstanceOf[Map[String, Any]]) (x._1 -> Some(x._2)) 
      else x)

Map(test -> data1, 
    cat -> None, 
    myList -> Some(Map(test2 -> data2, test3 -> data3)))

val valueToFieldMapping = output(fieldName).get.asInstanceOf[Map[String, String]]

我正在

java.lang.ClassCastException: scala.Some cannot be cast to scala.collection.immutable.Map

例外,如果有人对此有任何想法,请帮助我。谢谢

问题是这一行你没有对象实例上的 .get 属性。 你不需要 .get 如果你想使用 .get 方法然后做 output.get(fieldName)

val valueToFieldMapping = output(fieldName).get.asInstanceOf[Map[String, String]]

output.get(fieldName) 给你 Option[Object] 并且你试图将对象转换为 Map[String, String]

的实例

没有从 Option 到 map 的隐式转换,所以这就是您收到错误的原因:

java.lang.ClassCastException: scala.Some cannot be cast to scala.collection.immutable.Map

或者你可以这样做:

val valueToFieldMapping: Option[Map[String, String]] = output.get(fieldName).asInstanceOf[Option[Map[String, String]]]

首先,让我们使用 mapValues:

清理 output 的定义
val output = data.mapValues(x =>
  if (x.isInstanceOf[Map[String, Any]]) Some(x)
  else x)

然后这样做

val valueToFieldMapping = output(fieldName).asInstanceOf[Option[Map[String, String]]].get

您不能在创建 output 时生成的 Some 上调用 get,因为编译还不知道它是 Option

说了这么多,评论说使用 AnyasInstanceOf 真的很难看所以你需要找到一种更好的方式来表达你正在尝试做的事情.至少,使用 match 而不是 asInstanceOf 以便在对象不是您认为的那样时实现错误情况。