一个类型化的scala对象是如何失去它的类型的?

0aydgbwb  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(463)

在下面的代码中, entities 是一个 Map[String, Seq[String]] 我从其他代码段收到的对象。目标是将实体对象Map到一个两列sparkDataframe中;但是,在我到达那里之前,我发现了一些非常不寻常的结果。

val data: Map[String, Seq[String]] = Map("idtag" -> Seq("things", "associated", "with", "id"))

println(data)
println(data.toSeq)
data.toSeq.foreach{println}
data.toSeq.map{case(id: String, names: Seq[String]) => names}.foreach{println}

val eSeq: Seq[(String, Seq[String])] = entities.toSeq

println(eSeq.head)
println(eSeq.head.getClass)
println(eSeq.head._1.getClass)
println(eSeq.head._2.getClass)

eSeq.map{case(id: String, names: Seq[String]) => names}.foreach{println}

控制台上的上述输出为:

Map(idtag -> List(things, associated, with, id))
ArrayBuffer((idtag,List(things, associated, with, id)))
(idtag,List(things, associated, with, id))
List(things, associated, with, id)

(0CY4NZ-E,["MEC", "Marriott-MEC", "Media IQ - Kimberly Clark c/o Mindshare", "Mindshare", "WPP", "WPP Plc", "Wavemaker Global", "Wavemaker Global Ltd"])
class scala.Tuple2
class java.lang.String
class java.lang.String
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to scala.collection.Seq
        at package.EntityList$$anonfun$toStorage$4.apply(EntityList.scala:31)

这个 data 我硬编码的对象按预期运行。这个 .toSeq 实体Map上的函数生成 Seq (作为arraybuffer实现)元组;这些元组可以通过Map来处理。
但是使用 entities 对象,当我使用 .head 它是一个 Tuple2[String, String] . 怎么可能呢?元组的第二个元素如何变成字符串并导致异常?
如果最后一行被修改以反映 Tuple2[String, String] :

eSeq.map{case(id: String, names: String) => names}.foreach{println}

然后我们得到一个编译错误:

/path/to/repo/src/main/scala/package/EntityList.scala:31: error: pattern type is incompatible with expected type;
  found   : String
  required: Seq[String]
     eSeq.map{case(id: String, names: String) => names}.foreach{println}

我不能用一只手复制这种奇怪的行为 Map[String, Seq[String]] 我自己创造的,正如你在这段代码中看到的。有人能解释这种行为以及为什么会发生吗?

hwamh0ep

hwamh0ep1#

问题似乎是 entities.toSeq 在返回的数据类型上撒谎,所以我会查看“其他一些代码”并检查它是否做了正确的事情。
具体来说,它声称要返回 Seq[(String, Seq[String])] 编译人员相信这一点。但是 getClass 显示元组中的第二个对象实际上是 java.lang.String 不是 Seq[String] .
如果这是正确的,那么 match 语句将使用 unapply 提取值,然后在尝试转换时出错 names 到指定的类型。
我注意到这个字符串似乎是一个包含在
[ ] ,所以似乎有可能 entities 无法将其解析为 Seq 但声称它已经成功了。

相关问题