在Scala中对列表/序列进行模式匹配时解决类型擦除问题

时间:2014-11-03 19:16:50

标签: scala pattern-matching type-erasure

我遇到这样的情况:

我有一个我需要匹配的序列。实际上,在"案例"我只需要匹配一个元素为元组(String, Seq[String])的序列,但我找不到这样做的方法,所以我采用了我在网上阅读的技术:斩首seq,匹配第一个元素,并在块内重新附加以获得原始seq。

该方法的问题是:类型擦除。

从表达式" head +:rest"得到的seq;是Seq[Any]而不是Seq[(String, Seq[String])]

这就是tuple_.1给出编译错误的原因(附图中的第153行)。

如何解决这种情况?

enter image description here

1 个答案:

答案 0 :(得分:0)

这是我的不好,上面的截图中有几个编码错误;从序列匹配的case块我应该在末尾添加另一行:complexSeqReconstructed。

除此之外,还有一些细节:从“case Nil”开始,我还必须返回一个Seq [(String,Seq [String])]类型的空Seq,它匹配来自另一个的返回案件。这样Scala将正确执行类型推断。否则行hhh.map将无法编译(它会说,对象hhh没有map方法)。

所以这是更新的(工作)代码:

enter image description here

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
}
相关问题