了解 kotlin 中的内联 类
Understanding inline classes in kotlin
我正在尝试理解 kotlin 中的内联 classes
fun main(){
val password = Password("Current Password")
println(password)
println(password.password)
}
inline class Password(val password: String)
这是我根据文档编写的示例代码。现在他们说不会实例化 class 密码。
我的输出应该是
Current Password
Current Password
但是我得到了
Password(password=Current Password)
Current Password
如果不进行实例化,那么当我们尝试直接访问密码变量时,我们应该将其作为普通字符串访问,对吗?
只要您不在可空或通用上下文中使用它,它就不会编译为对象。如果这样做,它将像基元一样被包裹在一个对象中。
但是 toString()
和其他函数和属性仍然可以像 class 一样使用,就像它们用于基元一样。我不知道编译代码中的确切机制,但我猜测它们的实现方式与扩展函数相同(在 JVM 上,扩展函数被编译为静态方法,"receiver" 作为另一个参数)。
从您的角度来看,您仍然将其视为任何原始 classes,当它们可为 null 或用作泛型时,它们具有包装版本。但是您还有一个额外的好处,那就是能够覆盖 toString()
并在不使用扩展的情况下添加功能。
我正在尝试理解 kotlin 中的内联 classes
fun main(){
val password = Password("Current Password")
println(password)
println(password.password)
}
inline class Password(val password: String)
这是我根据文档编写的示例代码。现在他们说不会实例化 class 密码。
我的输出应该是
Current Password
Current Password
但是我得到了
Password(password=Current Password)
Current Password
如果不进行实例化,那么当我们尝试直接访问密码变量时,我们应该将其作为普通字符串访问,对吗?
只要您不在可空或通用上下文中使用它,它就不会编译为对象。如果这样做,它将像基元一样被包裹在一个对象中。
但是 toString()
和其他函数和属性仍然可以像 class 一样使用,就像它们用于基元一样。我不知道编译代码中的确切机制,但我猜测它们的实现方式与扩展函数相同(在 JVM 上,扩展函数被编译为静态方法,"receiver" 作为另一个参数)。
从您的角度来看,您仍然将其视为任何原始 classes,当它们可为 null 或用作泛型时,它们具有包装版本。但是您还有一个额外的好处,那就是能够覆盖 toString()
并在不使用扩展的情况下添加功能。