Scala中如何声明类似Java ArrayList<?>的任意类型数组变量?
正确声明方式
你可以直接将数组的元素类型显式指定为Scala类型系统的顶级父类Any,即可满足「可存储任意类型、支持修改元素、不使用隐式推断」的要求:
val monTabEntiersInit: Array[Any] = Array(1, 2, 5, 6) // 后续修改Int类型元素不会报错 monTabEntiersInit.update(0, 15) // 也支持存入其他任意类型的元素 monTabEntiersInit.update(1, "测试字符串")
此前尝试失败的原因
- 声明为
val monTabEntiersInit:Array = Array(1, 2, 5, 6)报错:
Scala中的Array是带类型参数的泛型类,使用时必须明确指定类型参数,不能直接使用无参数的裸Array类型。 - 声明为
val monTabEntiersInit:Array[_] = Array(1, 2, 5, 6)调用update时报错:Array[_]是Scala的存在类型,和Java的List<?>语义完全一致,编译器无法确定该数组的实际元素类型,为了保证类型安全,会禁止向数组中写入除null外的任意值,仅允许读取元素。
补充说明
如果你的使用场景仅需要读取数组元素、不需要修改,使用Array[_]声明是完全合法的;只有需要修改元素、且要支持存储任意类型时,才需要显式指定类型为Array[Any]。
内容的提问来源于stack exchange,提问作者Marc Le Bihan
相关产品推荐
相关产品推荐

