Понимание встроенных классов в kotlin - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь понять встроенные классы в kotlin

fun main(){
    val password = Password("Current Password")
    println(password)
    println(password.password)
}

inline class Password(val password: String)

Это пример кода, который я написал в соответствии с документацией. Теперь они сказали, что создание экземпляра класса Password не произойдет.

Мой вывод должен быть

Current Password
Current Password

Но я получаю

Password(password=Current Password)
Current Password

Если экземпляр не произойдет, тогда, когда мы пытаемся получить доступ к переменной пароля напрямую, мы должны обращаться к ней как к обычной строке, верно?

1 Ответ

4 голосов
/ 09 марта 2020

Он не скомпилирован в объект, если вы не используете его в обнуляемом или обобщенном c контексте. Если вы это сделаете, он будет обернут в объект так же, как это делают примитивы.

Но toString() и другие функции и свойства по-прежнему доступны для использования, как если бы это был класс, так же, как и для примитивы. Я не знаю точного механизма в скомпилированном коде, но я предполагаю, что они реализованы так же, как и функции расширения (которые в JVM компилируются как методы stati c с «получателем» в качестве другого аргумента).

С вашей точки зрения, вы по-прежнему относитесь к нему точно так же, как к любому из примитивных классов, которые имеют версии-оболочки для случаев, когда они обнуляются или используются в качестве обобщенных. Но у вас есть дополнительное преимущество: вы можете переопределять toString() и добавлять функции без использования расширений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...