Прием значения в Kotlin
Метка in на параметре типа описывает
обратную роль: объект принимает значения этого
типа, но не отдает их наружу как T.
Это не оператор проверки вхождения из цикла
и условий - здесь in стоит в объявлении
класса.
Накопитель строк принимает текст через метод и хранит его во внутреннем поле общего типа:
class Sink<in T> {
private var stored: Any? = null
fun accept(value: T) {
stored = value
}
fun describe(): String = stored.toString()
}
fun fillAny(target: Sink<Any>) {
target.accept("note")
}
fun main() {
val anySink = Sink<Any>()
fillAny(anySink)
println(anySink.describe())
}
Функция, которая работает с Sink<Any>,
может получить и более узкий Sink<String>:
потребитель готов принять любой объект, а строка
- частный случай:
fun feedString(sink: Sink<String>) {
sink.accept("api")
}
fun main() {
val wide: Sink<Any> = Sink()
feedString(wide)
println(wide.describe())
}
Сделайте класс-потребитель с меткой приема
на параметре типа и методом для записи
значения. Передайте его в функцию, которая
ждет потребитель Any, запишите число
42 и выведите текстовое описание
сохраненного.
Объявите функцию, которая принимает
потребитель строк и записывает в него
"ok". Вызовите ее для потребителя
с типом Any и выведите результат
описания.