Вызов метода с обнуляемой и не обнуляемой коллекцией - PullRequest
0 голосов
/ 29 ноября 2018

Возможно ли в Котлине написать функцию, которую можно вызывать с обнуляемыми и не обнуляемыми коллекциями?Я думаю о чем-то вроде этого:

fun <C: MutableCollection<out String>> f(c: C): C {
    // ...
}

Не то чтобы мне нужно было писать это так, потому что у меня есть возвращаемое значение типа C.Также обратите внимание на ключевое слово out, но даже с ним я не могу назвать f(mutableListOf<String?>), но f(mutableListOf<String>) работает нормально.Что я должен изменить здесь или это невозможно в Котлине?С массивами это будет работать просто отлично ...

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Я думаю, что вы тут все перепутаете (ссылаясь на ваш комментарий) ... 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()
0 голосов
/ 29 ноября 2018
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)))
}
...