@Parcelize 和 enum 类 - 重载解析歧义

@Parcelize and enum classes - Overload resolution ambiguity

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

 @Parcelize
 enum class Source : Parcelable {
    LIST, MAP
 }

class 用 @Parcelize 注释以实现 Parcelable 接口并且它工作正常,但是当我尝试传递 Parceled class 意图时我必须强制重新转换为 Parcelable,否则编译器会给我一个“Overload resolution ambiguity”。错误:

Overload resolution ambiguity. All these functions match. @RecentlyNonNull public open fun putExtra(name: String!, value: Parcelable!): Intent! defined in android.content.Intent @RecentlyNonNull public open fun putExtra(name: String!, value: Serializable!): Intent! defined in android.content.Intent

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

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

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

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

intent.putParcelableExtra(
    Constants.RETAIL_DETAILS_CLICK_SOURCE_ID, 
    StoreDetailsClicked.Source.MAP
)