簡體   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