【问题标题】:Pattern matching a generic class [duplicate]匹配泛型类的模式[重复]
【发布时间】:2019-06-03 15:28:18
【问题描述】:

为什么以下代码不能按预期工作?通过查看代码,我认为它可能会返回“数字列表”,因为数字是一个带有数字的列表。但我运行代码并将输出作为“字符串列表”。我想我清除了这里的大部分困惑。

val numbers: List[Int] = List(1,2,3)
val numbersMatch: String = numbers match {
  case listOfStrings: List[String] => "a list of strings"
  case listOfNumbers: List[Int] => "a list of numbers"
  case _ => ""
}
println(numbersMatch)

【问题讨论】:

  • 在 REPL 上运行它时发生了什么?结果是否符合预期?如果不是,为什么/如何不? SO 不应该用于“人工编译器”。
  • 我没有理解类型擦除的概念
  • 我认为您的意思是对发布的答案发表评论。但是你能澄清这个问题吗?您正在寻求答案,但没有问题。我想你想知道当你运行代码时会发生什么,但答案就是你自己运行代码。如果输出没有意义,请解释您的直觉是什么以及它失败的地方,然后有人可能会更深入地了解类型擦除或您的问题。照原样,你没有问过问题,只是发布了一个没有上下文的代码 sn-p。
  • 您好,欢迎来到 StackOverflow。请花一些时间阅读帮助页面,尤其是名为"What topics can I ask about here?""What types of questions should I avoid asking?" 的部分。更重要的是,请阅读the Stack Overflow question checklist。您可能还想了解Minimal, Complete, and Verifiable Examples
  • 你的问题很不清楚。对我来说,这段代码完全符合预期。所以,很明显,你似乎期望它做一些与我不同的事情。但是,你没有说你的期望是什么。当您不告诉我们您期望它做什么时,我们如何告诉您为什么代码没有按照您期望的那样做?

标签: scala


【解决方案1】:

这段代码将打印出它是一个字符串列表,这是在大多数 JVM 语言上编译泛型的方式的结果。

他们使用所谓的"Type erasure" 删除泛型。由于泛型类型在运行时不可用,Scala 无法区分List[String]List[Int],因此第一种情况匹配。如果你编译你的代码,Scala 实际上会警告你:

警告:没有结果的类型测试:List[Int] 类型的值也不能是 List[String](List[String] 的底层)(但仍可能匹配其擦除)

case listOfStrings: List[String] => "一个字符串列表"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多