Вызов метода с обнуляемой и не обнуляемой коллекцией

Возможно ли в 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()
Другие вопросы по тегам