Вызов метода с обнуляемой и не обнуляемой коллекцией
Возможно ли в Kotlin написать функцию, которая может быть вызвана с обнуляемыми и не обнуляемыми коллекциями? Я думаю о чем-то вроде этого:
fun <C: MutableCollection<out String>> f(c: C): C {
// ...
}
Не то чтобы мне нужно было писать так, потому что у меня есть возвращаемое значение типа C
, Также обратите внимание на out
ключевое слово, но даже с этим я не могу позвонить f(mutableListOf<String?>)
но f(mutableListOf<String>)
работает отлично. Что я должен изменить здесь или это невозможно в Котлине? С массивами это будет работать просто отлично...
2 ответа
fun <C: MutableCollection<out String?>> f(c: C): C {
return c;
}
fun main(args: Array<String>) {
println(f(mutableListOf("hello")))
println(f(mutableListOf<String?>(null)))
}
Я думаю, что вы смешиваете здесь (ссылаясь на ваш комментарий)... Collection<out T>
будет работать так же, как Array<out T>
, В таком случае T
может чем угодно (т.е. T : Any?
)... как только вы установите T
в String
что вы в основном делаете с вашим C
, тогда вы должны использовать ненулевой тип...
Хотя короткий ответ просто добавить ?
к универсальному типу C
то есть используя fun <C: MutableCollection<out String?>> f(c: C):C
Вот еще несколько примеров, которые могут помочь лучше понять, как все это играет вместе:
// your variant:
fun <C : MutableCollection<out String>> f1(c: C): C = TODO()
// given type must be non-nullable; returned one therefore contains too only non-nullable types
// your variant with just another generic type
fun <T : String, C : MutableCollection<out T>> f2(c: C): C = TODO()
// you have now your "out T", but it still accepts only non-nullable types (now it is probably just more visible as it is in front)
// previous variant adapted to allow nullable types:
fun <T : String?, C : MutableCollection<out T>> f3(c: C): C = TODO()
Наконец, решение вашей проблемы может быть одним из следующих (в зависимости от того, что вам действительно нужно):
fun <T : String?> f4a(c: MutableCollection<out T>): MutableCollection<out T> = TODO()
fun <C : MutableCollection<out String?>> f4b(c: C): C = TODO()