Использование Kotlin typealias для Map.Entry на карте

В Kotlin можно определить typealias для классов, следовательно, и для Map<K,V>. Допустим, у меня есть следующее:

typealias MyMap = Map<String, String>

Но что, если я также хочу назвать запись карты, например:

typealias MyEntry = Map.Entry<String, String>
typealias MyMap = Map<MyEntry> // error

Однако Kotlin этого не приемлет, так как Map<K,V> требует тип для ключа и значения. Возможно ли такое, как показано выше?


person Robin Trietsch    schedule 19.03.2020    source источник
comment
Если вы просто определите его как Map<String, String>, он все равно будет работать во всех смыслах и целях. На записи, которые вы получаете от MyMap, можно ссылаться как на записи MyEntry.   -  person RobCo    schedule 19.03.2020


Ответы (2)


Нет. Это не имеет ничего общего с typealias, а скорее с объявлением generic типов.

Для интерфейса Map требуется два типа parameters, и вы должны указать оба, иначе вы получите ошибку. Если вы хотите использовать Map, который является parameterized поверх его entry, а не Key, Value, вы можете определить свой собственный тип Map.

В приведенном выше случае, когда вы выполняете Map<MyEntry>, вы хотите, чтобы язык брал предоставленный вами параметр одного типа (MyEntry) и извлекал два его компонента (String и String), а затем использовал эти два компонента как два разных type parameters для Map. Извините, что вы слишком много просите.

MyEntry — это один type, и его можно использовать только как таковой. Ниже приведен пример этого

typealias MyMap = Map<MyEntry, String>
person mightyWOZ    schedule 19.03.2020
comment
Не думал об этом таким образом. Пример, который вы показываете выше, является одним из подходов, комментарий к моему вопросу от RobCo показывает другой. Спасибо, что подумали вместе! - person Robin Trietsch; 19.03.2020

Настоящий ответ — это mayyWOZ, но, возможно, этот совет тоже поможет:

Вы все еще можете использовать дженерики в псевдонимах типов для пересылки одного из аргументов:

typealias StringMap<T> = Map<String, T>
person RobCo    schedule 19.03.2020