关于Kotlin inline class无实例化特性的输出异常疑问
关于Kotlin Inline Class打印结果的疑问解答
嘿,这个问题我之前也碰到过,其实核心是对inline class的运行时表现和默认方法的理解偏差~
首先明确一点:你说的inline class不会被实例化是对的,但这并不意味着它所有的行为都和底层类型完全一致。我们来拆解你的问题:
为什么直接打印password会输出Password(password=Current Password)?
Kotlin编译器会为inline类自动生成默认的toString()方法,这个方法的实现和普通数据类的默认toString类似——会输出类名加上属性名和值的格式。虽然在运行时password本质上就是一个String,但当你调用println(password)时,实际上是触发了这个自动生成的toString()方法,而不是直接输出底层的字符串。
对比你的代码:
fun main(){ val password = Password("Current Password") println(password) // 等价于调用 password.toString(),使用默认实现 println(password.password) // 直接访问底层的String属性,所以输出原始内容 } inline class Password(val password: String)
怎么让打印结果符合你的预期?
很简单,手动重写toString()方法,让它直接返回底层的字符串即可:
inline class Password(val password: String) { override fun toString(): String = password }
这样再运行你的代码,两行输出就都是Current Password了。
补充一点:inline class的“无实例化”到底是什么意思?
inline class的设计目标是类型安全+零额外开销。在大多数场景下(比如作为函数参数、返回值,或者直接访问其属性),编译器会直接把inline class替换成它的底层类型(这里就是String),不会创建额外的对象。但当你调用它的成员方法(比如toString、equals)时,编译器会生成静态方法来处理这些调用,看起来像是在调用对象的方法,但实际上并没有创建Password对象。
内容的提问来源于stack exchange,提问作者Mohanakrrishna
相关产品推荐
相关产品推荐

