You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:12:43