Scala 模式匹配泛型类

Scala 模式匹配泛型类,scala,Scala,为什么下面的代码不能按预期工作?通过查看代码,我想它可能会返回“数字列表”,因为数字是包含数字的列表。但是我运行了代码,得到了“字符串列表”的输出。我想我清除了这里的大部分混乱 val numbers: List[Int] = List(1,2,3) val numbersMatch: String = numbers match { case listOfStrings: List[String] => "a list of strings" case listOfNumbers

为什么下面的代码不能按预期工作?通过查看代码,我想它可能会返回“数字列表”,因为数字是包含数字的列表。但是我运行了代码,得到了“字符串列表”的输出。我想我清除了这里的大部分混乱

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)

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

他们使用所谓的丢弃泛型。由于泛型类型在运行时不可用,Scala无法区分
List[String]
List[Int]
,因此第一个大小写匹配。如果编译代码,Scala实际上会警告您:

警告:无效类型测试:List[Int]类型的值也不能是List[String](List[String]的基础值)(但仍可能与其擦除匹配)

案例列表字符串:列表[字符串]=>“字符串列表”


在REPL上运行时发生了什么?结果符合预期吗?若否,原因/方式为何?所以不应该用于“人工编译器”。我不理解类型擦除的概念。我想你的意思是对发布的答案发表评论。但是你能澄清这个问题吗?你在问答案,但没有问题。我想你想知道当你运行代码时会发生什么,但是答案是你自己运行代码。如果输出没有意义,请解释一下你的直觉是什么以及它在哪里失败,然后有人可能会更深入地了解类型擦除或任何你的问题。实际上,您没有问任何问题,只是发布了一个没有上下文的代码片段。您好,欢迎来到StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。您可能还想了解。您的问题非常不清楚。对我来说,这段代码完全符合预期。所以,很明显,你似乎期望它做一些与我不同的事情。但是,你没有说你的期望是什么。当您不告诉我们您期望代码做什么时,我们如何告诉您为什么代码没有做您期望它做的事情?