Scala类型参数化:深入理解协变、逆变与下界
1. Scala数组的协变处理差异
在类型处理上,Scala相较于Java更为纯粹,它不将数组视为协变的。例如,将Java数组示例的前两行代码转换为Scala代码时:
scala> val a1 = Array("abc")
a1: Array[java.lang.String] = Array(abc)
scala> val a2: Array[Any] = a1
<console>:5: error: type mismatch;
found
: Array[java.lang.String]
required: Array[Any]
val a2: Array[Any] = a1
ˆ
从上述代码可以看出,Scala把数组当作非变体(刚性)处理,所以 Array[String] 并不被认为符合 Array[Any] 的类型要求。不过,在与使用 Object 数组模拟泛型数组的Java遗留方法交互时,Scala允许将 T 类型的数组强制转换为 T 的任何超类型数组:
scala> val a2: Array[Object] =
a1.asInstanceOf[Array[Object]]
a2: Array[java.lang.Object] = Array(abc)
超级会员免费看
订阅专栏 解锁全文
65

被折叠的 条评论
为什么被折叠?



