Kotlin中不继承抽象类如何创建该抽象类类型的数组?
问题原因
你遇到的报错本质是Kotlin与Java数组初始化逻辑的差异导致的:
Java中A[][] arr = new A[2][2]只是创建了一个能存储A类型引用的二维数组容器,数组内的元素默认初始化为null,不需要实例化抽象类A本身。
而你写的Kotlin代码Array(2) {Array(2) {A}}中,lambda表达式的作用是返回数组每个位置的初始值,你直接填入类名A时,Kotlin会默认尝试读取A的伴生对象,自然会触发"没有伴生对象"的报错,强行加伴生对象也只会得到A.Companion类型的数组,和你需要的A类型无关。
解决方案
分两种场景选择对应写法:
场景1:需要和Java写法完全等价,初始数组元素全为null
Kotlin默认要求变量非空,因此需要显式指定元素为可空的A?类型,初始值设为null即可:
abstract class A(name: String){ //some code } class B { // 等价于Java的 A[][] arr = new A[2][2]; var arr = Array(2) { Array<A?>(2) { null } } }
后续你可以将A的子类实例赋值给数组的任意位置,比如arr[0][0] = A的子类实例。
场景2:不需要空元素,使用非空类型数组
由于抽象类A无法直接实例化,你需要先定义A的实现子类,初始化数组时直接填充子类实例即可:
abstract class A(name: String){ //some code } // A的实现子类 class AImpl(name: String) : A(name) class B { // 二维数组的所有元素初始为AImpl实例,类型为Array<Array<A>>,无空值 var arr = Array(2) { Array(2) { AImpl("默认初始化值") } } }
内容的提问来源于stack exchange,提问作者Abhishek Sharma
相关产品推荐
相关产品推荐

