类型判断

需要进行类型判断时,可以使用前文所学的isInstanceOf[T]和asInstanceOf[T],也可使用模式匹配实现同样的功能。

案例:

  1. object TestMatchClass {
  2. def describe(x: Any) = x match {
  3. case i: Int => "Int"
  4. case s: String => "String hello"
  5. case m: List[_] => "List"
  6. case c: Array[Int] => "Array[Int]"
  7. case someThing => "something else " + someThing
  8. }
  9. def main(args: Array[String]): Unit = {
  10. //泛型擦除
  11. println(describe(List(1, 2, 3, 4, 5)))
  12. //数组例外,可保留泛型
  13. println(describe(Array(1, 2, 3, 4, 5, 6)))
  14. println(describe(Array("abc")))
  15. }
  16. }

匹配数据类型并且增加条件判断

  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]