Scala 模式匹配返回类型的探讨

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]
在这里插入图片描述

  1. 将上述代码进行修改,某个 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

  1. 再次修改,我们再看看
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)
}

要确保 resArray 类型,否则需要通过 res.asInstanceOf[Array[int]] 进行下行转换。

  • 转换称其他对象输出,如 List
println(res.toList)

若对象的静态类型为 Any,动态类型为 Array。即是使用了父类引用子类对象,即 Any a = Array[Int]

所以想要输出 a 对象的内容,首先需要使用 asInstanceOf 进行转化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈乐乐happy

觉得对你有用的话可以打赏打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值