Выбор ответа Middle Дженерики и вариантность обновлено
Верхняя граница T по умолчанию
Вопрос
Какое значение может принять T в fun <T> f(x: T)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Любые, включая nullable: граница по умолчанию Any? Неограниченный параметр T имеет верхнюю границу Any?, поэтому f(null) компилируется и T выводится как Nothing?.
Варианты ответа
- Только non-null типы, nullable надо разрешать явно
- Только классы, не интерфейсы и не функциональные типы
- Любые, включая nullable: граница по умолчанию
Any?правильный ответ - Только примитивы и
String
Разбор
Неограниченный параметр T имеет верхнюю границу Any?, поэтому f(null) компилируется и T выводится как Nothing?. Чтобы запретить null, пишут <T : Any>. Так часто ошибаются при написании кеша или репозитория: T внутри оказывается nullable, и x.hashCode() требует безопасного вызова.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Дженерики и вариантность»
- Проверка is List<String> и стирание типов
- Вариантность в объявлении и в месте использования
- Как обойти стирание типов
- Инвариантность, out и in
- Контравариантность in T
- Конфликт перегрузок из-за стирания
- Почему List<String> можно передать как List<Any>
- Дженерики Kotlin и Java