类型判断
需要进行类型判断时,可以使用前文所学的isInstanceOf[T]和asInstanceOf[T],也可使用模式匹配实现同样的功能。
案例:
object TestMatchClass {
def describe(x: Any) = x match {
case i: Int => "Int"
case s: String => "String hello"
case m: List[_] => "List"
case c: Array[Int] => "Array[Int]"
case someThing => "something else " + someThing
}
def main(args: Array[String]): Unit = {
//泛型擦除
println(describe(List(1, 2, 3, 4, 5)))
//数组例外,可保留泛型
println(describe(Array(1, 2, 3, 4, 5, 6)))
println(describe(Array("abc")))
}
}
匹配数据类型并且增加条件判断
def main(args: Array[String]): Unit = {
val a: Any = false //
// 如果是int类型的,并且int类型大于10的话就加10,
// 如果是字符串的话就全部变成大写
// 如果是boolean类型的话就直接输出出来
a match {
// int 类型并且大于10的话 会走这个分支
case a: Int if a > 10 => println(a + 10)
//String类型会走这个分支
case s: String => println(s.toUpperCase())
//Boolean类型会走这个分支
case b: Boolean => println(b)
case _ =>
}
}
输出 false
匹配集合框架里面的数据类型
def main(args: Array[String]): Unit = {
val arr: Any = List[Int](111)
arr match {
case a: Array[Int] => println("Array[Int]")
case a: Array[Double] => println("Array[Double]")
// 匹配任意数组
case a: Array[_] => println("Array[_]")
case a: List[Int] => println("List[Int]")
case a: List[_] => println("List[_]")
}
}
执行main函数: 输出
List[Int]
数组在scala中表面用到了泛型, 实际不是泛型
除了数组, 其他的所有泛型都是真正泛型
泛型模式匹配是无法匹配除了泛型的类型的
泛型擦除:
泛型的存在是为了在编译的时候类型更安全
泛型只存在于源码和编译的时候, 编译成字节码之后, 泛型就不存在.
def main(args: Array[String]): Unit = {
val arr: Any = List[String]("字符串")
arr match {
case a: Array[Int] => println("Array[Int]")
case a: Array[Double] => println("Array[Double]")
// 匹配任意数组
case a: Array[_] => println("Array[_]")
case a: List[Int] => println("List[Int]")
case a: List[_] => println("List[_]")
}
}
执行结果 ,上面即使是String类型的,然是执行Main方法之后还是下面的输出.
List[Int]