执行下面的代码
println("Pattern Matching by type")
val priceofCar : Any = 2.0
val priceType = priceofCar match{
case price: Int => "Int" // 1
case price: Float => "Float" // 2
case price: Any => "Any" // 3
case price: Double => "Double" // 4
case _ => "others" // 5
}
// println(:type priceofCar)
println(s"Car price type = $priceType")
最终得到以下输出
汽车价格类型 = 任何
和警告信息
警告:无法访问的代码
案例价格:Double => "Double"//4
^
发现一个警告。
但是,在交换行//3 和//4 的顺序后,没有显示警告并获得以下输出
车价类型 = 双倍
现在我的疑问是,
1)在这两种情况下它都应该坚持“双倍”或“任何”,但不是为什么?
2)为什么会抛出警告?
最佳答案
val priceType = priceofCar match{
case price: Int => "Int" // 1
case price: Float => "Float" // 2
case price: Any => "Any" // 3
case price: Double => "Double" // 4
case _ => "others" // 5
}
模式匹配是顺序匹配的,这意味着它首先将价格与第一种情况匹配,即价格:Int 然后 Float 然后 Any 等等。
我们应该首先保留最具体的类型,正如我们在图中看到的,Any 位于类型层次结构(最通用的类型)的顶部,它可以消耗任何东西,这就是您在
case price: Any
之后的行收到警告无用代码的原因。如果您在第 5 行看到,它表示 any 类型的 case price 位于这些类型的hierachy 的顶部。它将匹配任何 Int、Flot、String、List 或任何用户定义的数据类型。
这就是为什么 case price:Any 下面的行没有用,因为控制不会在 Any 之后进入下一个 case。
关于scala - Scala 模式匹配中无法访问的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53955327/