Size: a a a

2018 May 11

MZ

Maxim Zinchenko in Kotlin Moscow
он требует, чтобы было вот так
mutableMapOf<K, V?> (Pair(key, value))
если так делаешь, то всё ок, но маячит warning, что здесь нет необходимости в явном указании типов :)
источник

MZ

Maxim Zinchenko in Kotlin Moscow
на самом деле я знаю в чём здесь косяк вывода типов, но далеко не всегда это понятно
источник

NN

Nikolay Nesterov in Kotlin Moscow
adapter принимает <K, V?>, emptyKeyValue  выводится в <K, V> Это же разные типы
источник

MZ

Maxim Zinchenko in Kotlin Moscow
ну да Smth<V> не приводится к Smth<V?> автоматом и в этом проблема.
эта та же ернуда, из-за которой в java не работает List<Object> a = asList(1);

например, это заработает, если сделать
fun <K, V> adapter2(map: MutableMap<K, V>): MutableKeyValue<K, V> = ...
и использовать здесь его.
это отягощется тем, что в отличии от честных типов overload здесь не проканает
источник

MZ

Maxim Zinchenko in Kotlin Moscow
плохо то, что конкретно в этой ситуации никакого приведения <K, V> к  <K, V?> и не нужно. если бы вывод типов учитывал тип результата, то всё бы работало нормально
источник

NN

Nikolay Nesterov in Kotlin Moscow
> Smth<V> не приводится к Smth<V?>
так это же фишка. отсутствие ковариантности в дженериках спасает от многих выстрелов в ногу
источник

MZ

Maxim Zinchenko in Kotlin Moscow
с этим я и не спорю
источник

NN

Nikolay Nesterov in Kotlin Moscow
аот кстати так тоже работает
fun <K, V> of(key: K, value: V?): MutableKeyValue<K, V> {
   return value?.let { adapter(mutableMapOf(Pair(key, it as V?))) } ?: emptyKeyValue()
}
источник

NN

Nikolay Nesterov in Kotlin Moscow
просто говорим it as V?
источник

MZ

Maxim Zinchenko in Kotlin Moscow
ну это тоже самое - явное указание типа
источник

NN

Nikolay Nesterov in Kotlin Moscow
Да, но на это компилятор не ругается хотя бы ворнингом 🙂
источник

MZ

Maxim Zinchenko in Kotlin Moscow
согласен. хотя непонятно, какого фига :)
источник

MZ

Maxim Zinchenko in Kotlin Moscow
поправлю на такой вариант :)
источник

NN

Nikolay Nesterov in Kotlin Moscow
Ну, либо включать wildcards
источник

NN

Nikolay Nesterov in Kotlin Moscow
fun <K, V> adapter(map: MutableMap<K, out V?>)
источник

NN

Nikolay Nesterov in Kotlin Moscow
Вообще, похоже на какой-то corner-case вывода типов. Скорее всего, желание подружить джавовые дженерики и котлиновскую нуллабилити где-то дает сбой. Можно баг заслать
источник

MZ

Maxim Zinchenko in Kotlin Moscow
это создаст проблемы внутри adapter. в реальности-то он рассчитывает на V?
источник

NN

Nikolay Nesterov in Kotlin Moscow
А, там не только достается, но и пишется?
источник

MZ

Maxim Zinchenko in Kotlin Moscow
Nikolay Nesterov
Вообще, похоже на какой-то corner-case вывода типов. Скорее всего, желание подружить джавовые дженерики и котлиновскую нуллабилити где-то дает сбой. Можно баг заслать
да, именно так. вывод здесь не учитывает типа результата, хотя в других местах очень даже.
например
val a: MutableMap<String, String?> =  mutableMapOf("","")
вполне себе работает и здесь не происходит конвертации MutableMap<String, String> в MutableMap<String, String?>
источник

MZ

Maxim Zinchenko in Kotlin Moscow
Nikolay Nesterov
А, там не только достается, но и пишется?
да, он же MutableKeyValue
источник