为什么以下代码段无法按预期运行?通过查看代码,我认为它可能会返回“数字列表”,因为数字是带有数字的列表。但是我运行了代码,并将输出作为“字符串列表”。猜猜我清除了这里的大部分困惑。
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)
答案 0 :(得分:7)
此代码将打印出它是一个字符串列表,这是在大多数JVM语言上编译泛型的结果。
他们使用所谓的"Type erasure"来删除泛型。由于泛型类型在运行时不可用,因此Scala无法区分List[String]
和List[Int]
,因此第一种情况匹配。如果您编译代码,Scala会实际上警告您:
警告:没有结果的类型测试:List [Int]类型的值也不能是List [String](List [String]的基础)(但仍可能与擦除值匹配)
case listOfStrings:List [String] =>“字符串列表”