簡體   English   中英

Kotlin接口中的伴隨對象

[英]Companion Objects in Kotlin Interfaces

我正在嘗試創建一個Parcelable接口,因此我需要一個像這樣的接口

interface AB : Parcelable {
    companion object {
        val CREATOR : Parcelable.Creator<AB>
    }
}

和我的兩個A和B類看起來像

data class A (...): Parcelable{
    ...
    companion object {
        val CREATOR : Parcelable.Creator<AB> = object : Parcelable.Creator<AB> {
            override fun newArray(size: Int): Array<AB?> {
                return arrayOfNulls(size)
            }

            override fun createFromParcel(parcel: Parcel): AB {
                return A(parcel)
            }

        }
    }

我正在努力在kotlin中實現這樣的接口。 似乎接口類不允許CREATOR

也許我采取了錯誤的做法,
我有一個parcelable包含一個A或B類的列表,所以我正在做

parcel.readTypedList(this.list, AB.CREATOR)

我要求列表是A或B,這就是我使用接口的原因。

有人有任何建議或可能的解決方案嗎?

在Kotlin中,接口可以有一個companion object但它不是必須由實現接口的類實現的合同的一部分。 它只是一個與接口相關聯的對象,它有一個單例實例。 所以它是一個可以存儲東西的地方,但對實現類沒有任何意義。

但是,您可以擁有一個由類的companion object實現的接口。 也許你想要更像這樣的東西:

interface Behavior {
   fun makeName(): String
}

data class MyData(val data: String) {
    companion object: Behavior {  // interface used here
        override fun makeName(): String = "Fred"
    }
}

請注意,數據類不實現接口,但其companion object可以實現。

接口上的companion object對於存儲與接口相關的常量或輔助函數非常有用,例如:

interface Redirector {
    fun redirectView(newView: String, redirectCode: Int)

    companion object {
        val REDIRECT_WITH_FOCUS = 5
        val REDIRECT_SILENT = 1
    }
}

// which then can be accessed as:
val code = Redirector.REDIRECT_WITH_FOCUS

按照慣例,實現Parcelable接口的類還必須具有一個名為CREATOR的非空靜態字段,該字段實現Parcelable.Creator接口。

您需要使用@JvmField批注對CREATOR屬性進行批注,以將其公開為包含數據類的公共靜態字段。

您還可以查看https://github.com/grandstaish/paperparcel - 一個注釋處理器,它自動為Kotlin和Java生成類型安全的Parcelable包裝器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM