val arr = Array(1,2)
val res = arr match {
case Array(x,y) => Array(y,x)
case Array(x,y,z) => Array(0)
case _ => Array(-1)
}
对于上述代码,由于所有的 case
返回的均是 Array[Int]
,所以 res
的类型就是 Array[Int]
。
- 将上述代码进行修改,某个
case
返回Array[String]
val arr = Array(1,2)
val res = arr match {
case Array(x,y) => Array(y,x)
case Array(x,y,z) => Array("1")
case _ => Array(-1)
}
则 res
的类型要么是 Array[Int]
或 Array[String]
。
由此可见编译器会尽可能的使用较小的类型去包含所有的 case
。
- 再次修改,我们再看看
val arr = Array(1,2)
val res = arr match {
case Array(x,y) => Array(y,x)
case Array(x,y,z) => Array("1")
case _ => println(" ")
}
这次三个 case
返回的类型都不一样,其中默认分支返回的是 Unit
,因此想要包含该三个类型的类型应是 Any
。
如何对 Array
内容进行输出:
如果直接 Println(arr)
是无法得到内容的,而是返回对象签名(是否是这个专业术语我不确定),这一点底层原因我暂时不得而知。
解决方法如下 :
- 用 for 循环输出
for(item <- res){
println(item)
}
要确保 res
为 Array
类型,否则需要通过 res.asInstanceOf[Array[int]]
进行下行转换。
- 转换称其他对象输出,如
List
println(res.toList)
若对象的静态类型为 Any
,动态类型为 Array
。即是使用了父类引用子类对象,即 Any a = Array[Int]
所以想要输出 a
对象的内容,首先需要使用 asInstanceOf
进行转化。