Проекция типа в Kotlin
Класс коллекции объявлен без меток variance, но
в типе аргумента функции можно указать проекцию:
out или in на месте параметра
типа. Так задают, только читают ли из списка
или только пишут в него.
Открытый класс животного и два наследника понадобятся для примера чтения:
open class Animal(val name: String)
class Dog(name: String) : Animal(name)
class Cat(name: String) : Animal(name)
fun printNames(pets: MutableList<out Animal>) {
for (pet in pets) {
println(pet.name)
}
}
fun main() {
val dogs: MutableList<Dog> = mutableListOf(Dog("rex"))
printNames(dogs)
}
Запись в список через проекцию in
допускает более конкретный тип элементов,
когда функция лишь добавляет данные:
fun addDog(target: MutableList<in Dog>) {
target.add(Dog("mila"))
}
fun main() {
val animals: MutableList<Animal> = mutableListOf(Cat("lea"))
addDog(animals)
for (item in animals) {
println(item.name)
}
}
Сделайте базовый класс фигуры и наследника круг. Напишите функцию, которая выводит имена фигур из списка с проекцией для чтения. Передайте список кругов и проверьте вывод.
Напишите функцию, которая добавляет новый круг в список с проекцией для записи. Вызовите ее для списка фигур и выведите количество элементов после добавления.