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