繁体   English   中英

如何在不继承抽象类的情况下在 Kotlin 中创建抽象类的数组

[英]How to create an array of Abstract class in Kotlin Without inheriting the abstract class

我有 2 个类,A 类是抽象类,B 类像

abstract class A(name: String){
    //some code
}

class B {
    //some code
}

现在,如果我想在 B 类中添加 A 类类型的数组,它在 Java 中非常简单,例如

class B {
    A[][] arr = new A[2][2];
}

但我在 Kotlin 中尝试同样的方法

class B { 
    var arr = Array(2) {Array(2) {A}}
}

然后它给出错误,因为“分类器'A'没有伴随对象,因此必须在此处初始化”但后来我尝试在抽象类的伴随对象中放置一些变量,现在它没有给出任何错误。 但数组是由“A.companion”类型而不是“A”类型组成的。

如果您对此有所了解,请帮助我。

您的 Java 代码创建了一个由 2 个数组组成的数组,每个数组可以包含 2 个类型为A或 null 的对象,并且最初包含 null。 (在 Java 中,每个引用值都可以为空,所以这是标准做法。)

Kotlin 的等价物是:

Array(2){ Array(2){ null as A? }}

与 Java 代码一样,那里的每个元素都是可空的,并被初始化为空。

(你得到的错误是因为你试图给 Array 构造函数一个类型,但它期待一个值——所以它试图将A解释为一个值,并猜测你的意思是Acompanion object 。不要如果您不知道那是什么,请担心!)

但是,Kotlin 也支持不可为空的值,这通常是更可取的。 因此,如果您知道想要数组保存哪些值,更常见的是一次性创建和初始化它,这样类型就可以是不可为空的。 例如:

arrayOf(arrayOf(A("1"), A("2")),
        arrayOf(A("3"), A("4")))

请注意,在 Java 中,由new A[2][2]创建的数组仅包含null元素。 那里没有A的实例。 在 Kotlin 中,这将表示为Array<Array<A?>> ,而不是Array<Array<A>> ,因为A最初为 null。

就一维数组而言,您本质上有一个由 2 个元素组成的数组,每个元素都是一个仅包含空值的 2 个元素的数组。 因此,你可以写:

val aArray = Array<Array<A?>>(2) { arrayOfNulls(2) }

或者更短一点:

val aArray = Array(2) { arrayOfNulls<A>(2) }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM