Как Parcelize HashMap используя Parcelize Kotlin? - PullRequest
0 голосов
/ 04 июля 2019

Это то, что у меня есть для попытки @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 Ответ

1 голос
/ 04 июля 2019

Во-первых, @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:

коллекции всех поддерживаемых типов: List (сопоставленный с ArrayList), Set (сопоставленный с LinkedHashSet), Map (сопоставленный с LinkedHashMap);

Также имеется ряд конкретных реализаций: ArrayList, LinkedList, SortedSet, NavigableSet, HashSet, LinkedHashSet, TreeSet, SortedMap, NavigableMap, HashMap, LinkedHashMap, TreeMap, ConcurrentHashMap;

...