Что выведет код Middle Дженерики и вариантность обновлено
filterIsInstance и reified
Вопрос
Что выведет код? По строке на каждый вывод.
inline fun <reified T> List<Any?>.countOf(): Int = count { it is T }
fun main() {
val mixed: List<Any?> = listOf(1, "a", 2.5, "b", null, 3)
println(mixed.filterIsInstance<String>())
println(mixed.countOf<Int>())
println(mixed.countOf<Number>())
println(mixed.countOf<Any>())
println(mixed.countOf<Any?>())
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: [a, b], 2, 3, 5, 6. filterIsInstance использует reified и оставляет строки.
Что выведет
[a, b]
2
3
5
6
Разбор
filterIsInstance использует reified и оставляет строки. Int в списке два элемента. Number это общий супертип Int и Double, их три. null is Any ложно, поэтому Any даёт 5, а null is Any? истинно, поэтому 6.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Дженерики и вариантность»
- Проверка is List<String> и стирание типов
- Вариантность в объявлении и в месте использования
- Как обойти стирание типов
- Инвариантность, out и in
- Контравариантность in T
- Конфликт перегрузок из-за стирания
- Почему List<String> можно передать как List<Any>
- Дженерики Kotlin и Java