Выбор ответа Senior Дженерики и вариантность обновлено
Конфликт перегрузок из-за стирания
Вопрос
Почему две функции fun log(xs: List<Int>) и fun log(xs: List<String>) в одном файле не компилируются и как это исправить?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: После стирания JVM-сигнатуры совпадают; поможет @JvmName. Перегрузка в Kotlin разрешена, и для компилятора Kotlin сигнатуры различаются.
Варианты ответа
- Нельзя иметь две функции с одним именем в одном файле
- После стирания JVM-сигнатуры совпадают; поможет
@JvmNameправильный ответ - Kotlin не поддерживает перегрузку по типу коллекции, только по числу параметров
- Нужно сделать обе функции
inline, тогда сигнатур не будет
Разбор
Перегрузка в Kotlin разрешена, и для компилятора Kotlin сигнатуры различаются. Но в байткоде обе превращаются в log(Ljava/util/List;)V, это «platform declaration clash». @JvmName меняет имя метода в байткоде, а Kotlin-код продолжает вызывать обе как log. Перегрузка по типу параметра в Kotlin есть, мешает только стирание; inline проблему не решает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.