[英]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
解釋為一個值,並猜測你的意思是A
的companion 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.