Использование Kotlin typealias для Map.Entry в Map - PullRequest
3 голосов
/ 19 марта 2020

В 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> требует тип ключа и значение. Возможна ли такая вещь, как показано выше?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Нет. Это не имеет ничего общего с 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>
1 голос
/ 19 марта 2020

Реальный ответ - это mightyWOZ, но, возможно, этот совет также поможет:

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

typealias StringMap<T> = Map<String, T>
...