在Scala中对列表/序列进行模式匹配时解决类型擦除问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Scala中对列表/序列进行模式匹配时解决类型擦除问题相关的知识,希望对你有一定的参考价值。
我遇到这样的情况:
我有一个我需要匹配的序列。实际上,在“情况”中我只需要匹配一个元素是元组(String, Seq[String])
的序列,但我找不到办法做到这一点,所以我采用了我在网上阅读的技术:斩首seq,匹配第一个元素,并在块内重新附加以获得原始seq。
这种方法的问题是:类型擦除。
从表达式“head +:rest”得到的seq是Seq[Any]
而不是Seq[(String, Seq[String])]
这就是tuple_.1
给出编译错误的原因(附图中的第153行)。
如何解决这种情况?
答案
这是我的不好,上面的截图中有几个编码错误;从序列匹配的case块我应该在末尾添加另一行:complexSeqReconstructed。
除此之外,还有一些细节:从“case Nil”开始,我还必须返回一个类型为Seq [(String,Seq [String])]的空Seq ...与其他情况的返回相匹配。这样Scala将正确执行类型推断。否则行hhh.map将无法编译(它会说,对象hhh没有map方法)。
所以这是更新的(工作)代码:
val theComplexSeq: Seq[(String, Seq[String])] = Seq(
("the_key_a", Seq("value_a_1", "value_a_2"))
)
val hhh = theComplexSeq match {
case Nil => {
Seq[(String, Seq[String])]()
}
case (head: (String, Seq[String])) +: rest => {
println(head)
println(rest)
val complexSeqReconstructed = head +: rest
println(complexSeqReconstructed)
complexSeqReconstructed
}
}
hhh.map {tuple =>
println(tuple._1 + "->" + tuple._2)
tuple
}
以上是关于在Scala中对列表/序列进行模式匹配时解决类型擦除问题的主要内容,如果未能解决你的问题,请参考以下文章