KT Kotlin  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Вариантность

Тест разбирает out, in и проекции со звёздочкой через чтение и запись значений в API. Нужно определить безопасное направление использования типа и не путать вариантность объявления с проекцией в конкретной точке вызова.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
В «Список неизвестного типа» выбрали решение: Использовать `*`, когда тип элемента не нужен, а если нужен — принять параметр типа и сохранить связь с результатом. Какова его реальная цена?
Вопрос 2 из 25
Почему объект `length` совместим с требуемым типом?
KotlinПроектирование API · Поток типов через Mapper
// Проследите фактическое выполнение без изменения кода.
interface Mapper<in A, out B> { fun map(value: A): B }
val length = object : Mapper<CharSequence, Int> {
    override fun map(value: CharSequence) = value.length
}
fun use(m: Mapper<String, Number>) = m.map("abc")
fun main() = println(use(length))
Вопрос 3 из 25
Что точнее описывает механику фрагмента «Проверка producer/consumer API»?
KotlinТестирование и инструменты · Проверка producer/consumer API
// На ревью требуется объяснить причину поведения.
fun copyAll(from: List<out Number>, to: MutableList<in Number>) {
    from.forEach { to += it }
}
Вопрос 4 из 25
Какую правку выбрать, чтобы сохранить назначение «Ковариантный источник» и убрать хрупкость?
KotlinКовариантность out · Ковариантный источник
// Сохраните назначение фрагмента, но укрепите его контракт.
interface Source<out T> { fun next(): T }
class TextSource : Source<String> { override fun next() = "kt" }
fun readAny(source: Source<Any>) = source.next()
fun main() = println(readAny(TextSource()))
Вопрос 5 из 25
Какой контрпример точнее всего показывает границу «Контравариантный потребитель»?
Вопрос 6 из 25
Какой контракт снимает спор о причине поведения «Поток типов через Mapper»?
KotlinПроектирование API · Поток типов через Mapper
// На ревью требуется объяснить причину поведения.
interface Mapper<in A, out B> { fun map(value: A): B }
val length = object : Mapper<CharSequence, Int> {
    override fun map(value: CharSequence) = value.length
}
fun use(m: Mapper<String, Number>) = m.map("abc")
fun main() = println(use(length))
Вопрос 7 из 25
Как превратить неявное предположение в проверяемый контракт «Проверка producer/consumer API»?
KotlinТестирование и инструменты · Проверка producer/consumer API
// Сохраните назначение фрагмента, но укрепите его контракт.
fun copyAll(from: List<out Number>, to: MutableList<in Number>) {
    from.forEach { to += it }
}
Вопрос 8 из 25
Где поведение «Ковариантный источник» требует отдельной проверки?
Вопрос 9 из 25
Команда собирается выделять consumer-контракт без возврата T, если реализация должна обслуживать значения разных подтипов. Что придётся учитывать после внедрения в «Контравариантный потребитель»?
Вопрос 10 из 25
Какие числа будут выведены?
KotlinПроекции со звёздочкой · Список неизвестного типа
// Проследите фактическое выполнение без изменения кода.
fun sizeOf(x: List<*>) = x.size
fun main() {
    println(sizeOf(listOf(1, 2, 3)))
    println(sizeOf(listOf("a")))
}
Вопрос 11 из 25
Какой соседний случай отличает устойчивое решение «Проверка producer/consumer API» от удачного примера?
Вопрос 12 из 25
Для «Ковариантный источник» предлагают правку: Помечать producer-интерфейсы ковариантными, если их публичный контракт только выдаёт значения типа T. Какой компромисс нельзя пропустить?
Вопрос 13 из 25
Почему `Sink<Any>` подходит функции?
KotlinКонтравариантность in · Контравариантный потребитель
// Проследите фактическое выполнение без изменения кода.
fun interface Sink<in T> { fun accept(value: T) }
fun sendStrings(sink: Sink<String>) { sink.accept("Kotlin") }
fun main() {
    val anySink = Sink<Any> { println(it) }
    sendStrings(anySink)
}
Вопрос 14 из 25
Что точнее описывает механику фрагмента «Список неизвестного типа»?
KotlinПроекции со звёздочкой · Список неизвестного типа
// На ревью требуется объяснить причину поведения.
fun sizeOf(x: List<*>) = x.size
fun main() {
    println(sizeOf(listOf(1, 2, 3)))
    println(sizeOf(listOf("a")))
}
Вопрос 15 из 25
Какую точечную правку стоит принять на ревью фрагмента «Поток типов через Mapper»?
KotlinПроектирование API · Поток типов через Mapper
// Сохраните назначение фрагмента, но укрепите его контракт.
interface Mapper<in A, out B> { fun map(value: A): B }
val length = object : Mapper<CharSequence, Int> {
    override fun map(value: CharSequence) = value.length
}
fun use(m: Mapper<String, Number>) = m.map("abc")
fun main() = println(use(length))
Вопрос 16 из 25
Почему вызов допустим и что он выведет?
KotlinКовариантность out · Ковариантный источник
// Проследите фактическое выполнение без изменения кода.
interface Source<out T> { fun next(): T }
class TextSource : Source<String> { override fun next() = "kt" }
fun readAny(source: Source<Any>) = source.next()
fun main() = println(readAny(TextSource()))
Вопрос 17 из 25
Почему пример «Контравариантный потребитель» даёт именно такой результат?
KotlinКонтравариантность in · Контравариантный потребитель
// На ревью требуется объяснить причину поведения.
fun interface Sink<in T> { fun accept(value: T) }
fun sendStrings(sink: Sink<String>) { sink.accept("Kotlin") }
fun main() {
    val anySink = Sink<Any> { println(it) }
    sendStrings(anySink)
}
Вопрос 18 из 25
Как превратить неявное предположение в проверяемый контракт «Список неизвестного типа»?
KotlinПроекции со звёздочкой · Список неизвестного типа
// Сохраните назначение фрагмента, но укрепите его контракт.
fun sizeOf(x: List<*>) = x.size
fun main() {
    println(sizeOf(listOf(1, 2, 3)))
    println(sizeOf(listOf("a")))
}
Вопрос 19 из 25
Какой сценарий выявит скрытое ограничение «Поток типов через Mapper»?
Вопрос 20 из 25
Решение для «Проверка producer/consumer API»: Добавить compile-testing пример, который должен отвергать запись неподходящего типа, и обычный тест успешного копирования между разными уровнями иерархии. Что в нём остаётся не бесплатным?
Вопрос 21 из 25
Как сделать ответственность во фрагменте «Контравариантный потребитель» понятной следующему разработчику?
KotlinКонтравариантность in · Контравариантный потребитель
// Сохраните назначение фрагмента, но укрепите его контракт.
fun interface Sink<in T> { fun accept(value: T) }
fun sendStrings(sink: Sink<String>) { sink.accept("Kotlin") }
fun main() {
    val anySink = Sink<Any> { println(it) }
    sendStrings(anySink)
}
Вопрос 22 из 25
Какой соседний случай отличает устойчивое решение «Список неизвестного типа» от удачного примера?
Вопрос 23 из 25
Команда собирается начинать с инвариантного API и добавлять `in`/`out`, когда позиции параметра доказывают безопасность и реальную пользу потребителям. Что придётся учитывать после внедрения в «Поток типов через Mapper»?
Вопрос 24 из 25
Что нужно проверить отдельно, чтобы не принять «Проверка producer/consumer API» за универсальное правило?
KotlinТестирование и инструменты · Проверка producer/consumer API
// Проследите фактическое выполнение без изменения кода.
fun copyAll(from: List<out Number>, to: MutableList<in Number>) {
    from.forEach { to += it }
}
Вопрос 25 из 25
Какое объяснение результата «Ковариантный источник» выдерживает проверку соседними случаями?
KotlinКовариантность out · Ковариантный источник
// На ревью требуется объяснить причину поведения.
interface Source<out T> { fun next(): T }
class TextSource : Source<String> { override fun next() = "kt" }
fun readAny(source: Source<Any>) = source.next()
fun main() = println(readAny(TextSource()))

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу