如何使用Kotlin的Parcelize打包HashMap?

时间:2019-07-03 22:08:40

标签: android kotlin parcelable

这就是我尝试@Parcelize HashMap的目的

@Parcelize
class DataMap : HashMap<String, String>(), Parcelable

但是它甚至无法使用以下代码进行编译。

val data = DataMap()
data.put("a", "One")
data.put("b", "Two")
data.put("c", "Three")

val intent = Intent(this, DetailActivity::class.java)
intent.putExtra(DATA_MAP, data)
startActivity(intent)

它在此行intent.putExtra(DATA_MAP, data)上报错,

Overload resolution ambiguity. All these functions match.

public open fun putExtra(name: String!, value: Parcelable!): Intent! defined in android.content.Intent

public open fun putExtra(name: String!, value: Serializable!): Intent! defined in android.content.Intent

1 个答案:

答案 0 :(得分:1)

首先,@Parcelize只关心主要的构造函数参数,而不关心超类;由于您一无所有,因此它生成的代码将不会从Parcel写入或读取任何内容。

因此,除了扩展HashMap(反而是一个坏主意)之外,您应该将其设置为字段:

@Parcelize
class DataMap(
    val map: HashMap<String, String> = hashMapOf()
) : Parcelable, MutableMap<String, String> by map

MutableMap<String, String> by map部分使DataMap通过委派所有调用来实现接口,因此data.put("a", "One")data.map.put("a", "One")相同。

它也没有实现Serializable,因此您不会遇到相同的过载歧义。

您可以在https://kotlinlang.org/docs/tutorials/android-plugin.html上看到受支持的类型列表,并且其中确实包含HashMap

  

所有受支持类型的集合:列表(映射到ArrayList),集合(映射到LinkedHashSet),映射(映射到LinkedHashMap);

     

还有许多具体的实现:ArrayList,LinkedList,SortedSet,NavigableSet,HashSet,LinkedHashSet,TreeSet,SortedMap,NavigableMap,HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap;