💡 Инструкция: Выберите один ответ из пяти. На 25 вопросов отведено 70 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 5 тематических шкал.
Вопрос 1 из 25
Какое изменение лучше всего защищает границу «Общий тип под upper bound»?
Kotlin Ограничения параметров типов · Общий тип под upper bound Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
fun <T> maxLength(a: T, b: T): Int where T : CharSequence =
maxOf(a.length, b.length)
fun main() = println(maxLength("abc", StringBuilder("hello")))
Добавить локальную обработку результата, потому что будет выведено `3`: первым аргументом фиксируется тип String и второй отбрасывается.
Ограничиться поясняющим комментарием о том, что возникнет ClassCastException при приведении StringBuilder к String.
Формулировать минимальную границу, реально нужную алгоритму, а не привязывать функцию к конкретной реализации.
Сохранить API и считать достаточным условие: Будет выведено `8`, поскольку длины складываются.
Зафиксировать текущее поведение регрессионным тестом: Вызов не компилируется, потому что аргументы обязаны иметь один и тот же конкретный класс.
Вопрос 12 из 25
Какая правка устраняет причину риска в «Проверки generic-утилиты», а не только его проявление?
Kotlin Тестирование и инструменты · Проверки generic-утилиты Копировать
// Сохраните назначение фрагмента, но укрепите его контракт.
inline fun <reified T> firstOf(values: List<Any>): T? =
values.firstOrNull { it is T } as T?
fun main() = println(firstOf<String>(listOf(1, "ok", 2)))
Убрать ненужный cast через `filterIsInstance<T>().firstOrNull()` либо локализовать его и доказать инвариант тестами.
Перенести проверку в вызывающий код, исходя из того, что нужно проверять только скорость на миллионе элементов, потому что типобезопасность гарантирована reified.
Вынести участок в отдельный метод, считая верным следующее: Следует сравнить текст декомпилированного байткода, не выполняя функцию на данных.
Спрятать участок за вспомогательной функцией, сохранив предположение: Достаточно одного теста со строкой в середине: остальные ветви эквивалентны компилятору.
Оставить реализацию без изменений и закрепить тестом предположение: Полезен лишь тест, что функция компилируется; поведение `firstOrNull` уже проверено библиотекой.