Синтаксис Kotlin: разница между использованием имени класса вместо имени сопутствующего объекта

Глядя на этот код, имитирующий установку функций в Ktor приложений.

fun main(args: Array<String>) {
    val app = App()
    app.installFeature(Authentication)
}

interface AppFeature {
    fun install()
}

class Authentication {

    companion object Feature : AppFeature {
        override fun install() = println("Authentication Installed")
    }
}

class App {

    fun installFeature(appFeature: AppFeature) {
        println("Installing appFeature `${appFeature::class.simpleName}`")
        appFeature.install()
    }
}

Что для меня не имеет смысла в приведенном выше фрагменте, так это эта строка app.installFeature(Authentication)

Может ли кто-нибудь объяснить мне, почему использование имени class вместо имени companion object работает так же, как более очевидный способ app.installFeature(Authentication.Feature)


person Omar Sahl    schedule 06.11.2018    source источник


Ответы (1)


Как указано в документации:

Члены сопутствующего объекта можно вызывать, просто используя имя класса в качестве квалификатора.

Точно так же вы можете использовать Authentication как AppFeature напрямую.

person s1m0nw1    schedule 06.11.2018