【问题标题】:Work around type-erasure when doing pattern-match of a list / sequence in Scala在 Scala 中对列表/序列进行模式匹配时解决类型擦除问题
【发布时间】:2014-11-03 19:16:49
【问题描述】:

我遇到了这样的情况:

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

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

表达式“head +:rest”的结果序列是Seq[Any],而不是Seq[(String, Seq[String])]

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

如何解决这种情况?

【问题讨论】:

  • 类型擦除不是您的问题。您的问题是 Nil 案例导致 String 但您的第二个案例导致 Unitprintln 的返回类型)。所以hhh是这两种类型中最小的上界,也就是Any,并且没有.map方法。您的 Scala 中有很多基本错误,而且您还不清楚您要完成什么。您可能需要提出一个包含您预期结果的问题。
  • 嗨,是的,我刚刚发现了它(除了一些其他编码错误)。感谢您指出。我将更新我的问题说明,放置更新(工作)代码的屏幕截图。谢谢!
  • 请不要在屏幕截图中包含代码——它难以阅读,降低搜索的实用性,并损害可访问性。
  • 好的,我现在将发布工作代码。顺便说一句......问题是我正在处理的代码的简化版本......在我的代码中,我仍然遇到“元组”未被编译器识别为元组的情况,而是作为任何。还在看。

标签: scala pattern-matching type-erasure


【解决方案1】:

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

除此之外,还有一点细节:从“case Nil”开始,我还必须返回一个 Seq[(String, Seq[String])] 类型的空 Seq ...案子。这样 Scala 将正确地执行类型推断。否则 hhh.map 行将无法编译(它会说,Object 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
}

【讨论】:

  • 我已将您的编辑从问题中删除,并将其放入您的答案中。不应在原始问题中提供答案。
猜你喜欢
  • 2018-01-30
  • 2015-08-18
  • 2011-11-04
  • 2011-10-12
  • 1970-01-01
  • 2016-03-10
  • 2018-04-12
  • 2015-10-06
  • 2016-01-24
相关资源
最近更新 更多