如何解决类型不匹配的问题?

时间:2018-07-01 02:38:08

标签: scala apache-spark spark-streaming

我有一个流媒体工作,并且对类型转换有疑问。以下是我的代码:

val component = data.get("viewed_objects").get.asInstanceOf[ListBuffer[Map[String, Any]]]

但例外是

  

scala.collection.immutable。$ colon $ colon无法转换为scala.collection.ListBuffer

什么原因导致了该问题以及如何解决?

1 个答案:

答案 0 :(得分:1)

在scala中,scala.collection.immutable.$colon$colon仅表示数据为scala.collection.immutable.List,因为List是使用cons::)表示法生成的。

所以错误

  

scala.collection.immutable。$ colon $ colon无法转换为scala.collection.ListBuffer

意味着您正尝试将List转换为ListBuffer,并且它们不兼容。

所以您可以做的是将ListBuffer更改为List

val component = data.get("viewed_objects").get.asInstanceOf[List[Map[String, Any]]]

但这将是无用的类型转换,因为data.get("viewed_objects").get已经是List[Map[String, Any]]类型

就这样

val component = data.get("viewed_objects").get
//component: List[scala.collection.immutable.Map[String,Any]] = ...

足够了

我希望答案会有所帮助

更新

您评论为

  

btw,如果数据值为data:Map(),则意味着一个空的Map,您的代码将返回异常None.get异常。如何优雅地处理它?<​​/ p>

为此,您将Try getOrElse用作

val component = Try(data.get("viewed_objects").get).getOrElse(List(Map.empty[String, Any]))

或者您可以将模式匹配用作

val component = data.get("viewed_objects") match {case Some(data) => data; case None => List(Map.empty[String, Any])}