[英]Is it possible to make a global, generic function for multiple companion objects in 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.