模式匹配泛型类

时间:2019-01-08 21:50:52

标签: scala

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

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)

1 个答案:

答案 0 :(得分:7)

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

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

  

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

     

case listOfStrings:List [String] =>“字符串列表”