Scala 类型参数化:深入理解方差、下界与对象私有数据
1. Scala 数组的不变性
Scala 在处理数组时,不像 Java 那样将数组视为协变的。例如,将 Java 数组示例的前两行代码转换为 Scala 代码如下:
scala> val a1 = Array("abc")
a1: Array[String] = Array(abc)
scala> val a2: Array[Any] = a1
<console>:8: error: type mismatch;
found : Array[String]
required: Array[Any]
val a2: Array[Any] = a1
^
这表明 Scala 将数组视为不变的(刚性的),因此 Array[String]
不被认为是 Array[Any]
的子类型。不过,有时需要与 Java 中的遗留方法交互,这些方法使用 Object
数组来模拟泛型数组。为了实现这一点,Scala 允许将 T
类型的数组转换为 T
的任何超类型的数组:
scala> val a2: Array[Object] =
a1.asInstanceOf[Array[Object]]
a2: Array[Object] = Arra