Nullable аргумент для котлин "удалить" - PullRequest
3 голосов
/ 28 апреля 2019

Я просто пытаюсь понять немного больше о объявлениях типа Nullable Kotlin.Объявление типа MutableList.remove:

fun <T> MutableCollection<out T>.remove(element: T): Boolean

Тем не менее, следующее компилируется и запускается, даже если выведенный тип myBook равен Stuff?, а его значение равно null.

data class Stuff(val name: String)

fun main(args: Array<String>) {
    val myListOfStuff: ArrayList<Stuff> = arrayListOf(
            Stuff("bed"),
            Stuff("backpack"),
            Stuff("lunch")
    )
    val myBook = myListOfStuff.find { it.name == "book" }
    val found = myListOfStuff.remove(myBook)
    println(myListOfStuff)
}

Почему в объявлении типа remove не используется обнуляемый тип T?, что-то вроде этого?

fun <T> MutableCollection<out T>.remove(element: T?): Boolean

Или, точнее, как out модификатор позволяет T быть обнуляемым?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2019

Полагаю, вы на самом деле не вызываете функцию-член, на которую ссылаетесь, а скорее следующую функцию расширения:

fun <T> MutableCollection<out T>.remove(element: T): Boolean
2 голосов
/ 29 апреля 2019

Тип T в

  fun <T> MutableCollection<out T>.remove(element: T): Boolean

выводится как Stuff?.Ваша строка

  val found = myListOfStuff.remove(myBook)

пытается удалить все вхождения null, поскольку myBook равно нулю.Это, очевидно, не может найти ни одного, но компилятор не возражает.

Ключевое слово out гарантирует компилятору, что никакие функции, такие как add(element), не будут вызываться (add(null) будет проблемой), только функции, которые возвращают T, как get().

См. Это для уточнения:

data class Stuff(val name: String)

fun main(args: Array<String>) {
    val myListOfStuff: ArrayList<Stuff?> = arrayListOf(
            Stuff("bed"),
            Stuff("backpack"),
            Stuff("lunch"),
            null
    )
    println(myListOfStuff)
    val found = myListOfStuff.remove(null)
    println(myListOfStuff)
} 

Вывод:

[Stuff(name=bed), Stuff(name=backpack), Stuff(name=lunch), null]
[Stuff(name=bed), Stuff(name=backpack), Stuff(name=lunch)]

Для ключевого слова out см. Здесь: https://kotlinlang.org/docs/reference/generics.html#declaration-site-variance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...