You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:24:03