Тип 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