这就是我尝试@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
答案 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;