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

scala.Some无法强制转换为scala.collection.immutable.Map异常,scala,scala-collections,Scala,Scala Collections,我是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 -> S

我是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,然后执行output.get(fieldName)

output.get(fieldName)
为您提供了
选项[Object]
,您正试图将Object转换为
映射[String,String]

没有从选项到映射的隐式转换,因此这就是您出现错误的原因:

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
您不能在创建
输出时生成的
Some
上调用
get
,因为编译器还不知道它是
选项


说了这么多,评论说使用
Any
代替
真的很难看,所以你需要找到一种更好的方式来表达你想做的事情。至少,使用
match
而不是
asInstanceOf
,这样,如果对象不是您认为的对象,您就可以实现错误情况。

您的代码让我有点困惑。就像第9行声明的
映射
没有分配给任何
val
。。。它曾经被使用过吗?另外,您似乎使用输入
fieldName
调用函数
output
。。。函数在哪里定义?什么是
fieldName
?最后一件事。。。您的数据是从
String
Any
映射。。。是否有任何特定的原因需要
any
?它可能会导致很多麻烦和以后的强制转换异常。强制转换和
Any
通常是以前出错的症状。请提供完整的代码,例如所有参数的值。@MFiry
output
是一个
Map
不是一个函数,
输出(fieldValue)
正在使用键
fieldValue
映射中提取值。字段名是什么?为什么
输出(fieldName)。获取
给出
选项[对象]
output
的类型是
Map[String,Any]
因此
output(fieldName)
Any
(或异常),并且
Any
没有
get
方法。也许您正在考虑使用
output.get(fieldName)
返回
Option[Any]
?是的,我只是错过了类型化的元素输出。get(fieldName)给出了选项[Object],因为输出的类型是:Map[String,Object]
val valueToFieldMapping = output(fieldName).asInstanceOf[Option[Map[String, String]]].get