首页 > 解决方案 > 如何解决类型不匹配问题?

问题描述

我有一个火花流工作,并且有一个关于类型转换的问题。以下是我的代码:

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

但例外是

scala.collection.immutable.$colon$colon 不能转换为 scala.collection.ListBuffer

是什么导致了这个问题,我该如何解决?

标签: scalaapache-sparkspark-streaming

解决方案


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

所以错误

scala.collection.immutable.$colon$colon 不能转换为 scala.collection.ListBuffer

表示您正在尝试转换ListListBuffer并且它们不兼容。

所以你可以做的就是改变ListBufferList

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]] = ...

就足够了

我希望答案有帮助

更新

你评论为

顺便说一句,如果数据值为 data:Map(),这意味着一个空 Map,您的代码将返回异常 None.get 异常。如何优雅地处理它?

因为你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])}

推荐阅读