@Parcelize 和枚举类 - 重载解析歧义

Nic*_*zzi 2 enums android parcel parcelable kotlin

我需要澄清一下@ParcelizeKotlin 中的注释。我已经声明了这个枚举类:

 @Parcelize
 enum class Source : Parcelable {
    LIST, MAP
 }
Run Code Online (Sandbox Code Playgroud)

该类被注释@Parcelize以实现 Parcelable 接口并且它工作正常,但是当我尝试以意图传递 Parceled 类时,我必须强制重新转换为 Parcelable,否则编译器会给我一个“重载解析歧义” . 错误:

重载解析歧义。所有这些功能都匹配。@RecentlyNonNull public open fun putExtra(name: String!, value: Parcelable!): Intent!定义在 android.content.Intent @RecentlyNonNull public open fun putExtra(name: String!, value: Serializable!): Intent! 在 android.content.Intent 中定义

val intent = Intent(context, DestinationActivity::class.java)
intent.putExtra(Constants.RETAIL_DETAILS_CLICK_SOURCE_ID, StoreDetailsClicked.Source
                    .MAP as Parcelable)
Run Code Online (Sandbox Code Playgroud)

为什么编译器给我这个错误?

kco*_*ock 16

这是因为默认情况下枚举是可序列化的,并且当您添加 Parcelable 时,它​​会匹配两个方法签名。您可以添加扩展函数来解决歧义:

fun Intent.putParcelableExtra(key: String, value: Parcelable) {
    putExtra(key, value)
}

intent.putParcelableExtra(
    Constants.RETAIL_DETAILS_CLICK_SOURCE_ID, 
    StoreDetailsClicked.Source.MAP
)
Run Code Online (Sandbox Code Playgroud)

  • 当然,我现在明白了。扩展功能比每次都强制转换要好!感谢您的建议! (2认同)