执行以下代码
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行的顺序之后,没有显示警告,并获得以下输出
汽车价格类型= Double
现在我的疑问是, 1)在两种情况下都应坚持“ Double”或“ Any”,但为什么不这样做呢? 2)为什么会引发警告?
答案 0 :(得分:11)
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位于类型hierachy(最通用的类型)的顶部,它会消耗掉任何东西,这是您在之后得到警告无用代码的原因case price: Any
如果您在第5行中看到它说类型为any的案例价格,则该价格位于类型的最高级别。它将匹配任何Int,Flot,String,List或任何用户定义的数据类型。 这就是为什么案例价格下面的行:Any没有用,因为控件不会转到Any之后的下一个案例。
答案 1 :(得分:3)
case price: Any
与包括Double
在内的任何内容都匹配,因此如果在case price: Double
之后则更新。
答案 2 :(得分:-1)