Что выведет код Middle Java-интероп обновлено

Значения по умолчанию через рефлексию Java

Вопрос

Что выведет код? По строке на каждый вывод.

class Greeter {
    @JvmOverloads
    fun greet(name: String = "гость", punct: String = "!"): String = "Привет, $name$punct"
}

fun main() {
    val methods = Greeter::class.java.declaredMethods
        .filter { it.name == "greet" }
        .map { it.parameterCount }
        .sorted()
    println(methods)
    println(Greeter().greet(punct = "?"))
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: [0, 1, 2], Привет, гость? @JvmOverloads генерирует перегрузки для Java, отбрасывая параметры с дефолтами справа налево: без параметров, с одним name и с обоими.

Что выведет

[0, 1, 2]
Привет, гость?

Разбор

@JvmOverloads генерирует перегрузки для Java, отбрасывая параметры с дефолтами справа налево: без параметров, с одним name и с обоими. Рефлексия Java видит три метода greet. Из Kotlin по-прежнему можно пропускать любые параметры через именованные аргументы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме