scala.Some无法强制转换为scala.collection.immutable.Map异常
我是scala的新手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
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
通常是以前出错的症状。请提供完整的代码,例如所有参数的值。@MFiryoutput
是一个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