编程后端开发工程师

什么是Kotlin中的'inline class'(值类)?它们有什么用,如何正确使用,它们有什么限制和特性?请提供代码示例。

用 Hintsage AI 助手通过面试

答案

inline class(从Kotlin 1.5开始称为value class)允许创建对原始类型的包装,而无需在运行时创建单独的对象。这用于增强类型安全性而不增加内存分配的开销。在底层,这些对象可以编译为相应的原始类型。

示例:

@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
  • 仅允许一个属性(主字段)。
  • 不允许无参数构造函数。
  • 类不能包含状态(例如,var字段),只能使用val。
  • 不能继承其他类,但可以实现接口。
  • 与Java代码的交互可能并不明显 — 可能发生装箱/拆箱。

使用inline/value类对于标识符、货币、单位等的类型化很重要。

诱导性问题

值类可以有多个属性吗?

答案: 不可以。值类只能在主构造函数中包含一个属性。

错误代码示例:

@JvmInline value class Money(val amount: Int, val currency: String) // 编译错误

由于不了解主题的细微之处而导致的实际错误示例


故事

在货币兑换处,使用inline class来描述金额和货币。尝试在值类中添加两个字段时,发生了编译错误,并花了一些时间试图绕过这个限制。最终决定创建单独的data class。


故事

在与外部Java库集成时,inline class有时意外地转换为对象(装箱),影响了性能。经过文档分析,替换为普通的值对象。


故事

在微服务项目中,使用值类作为API中的id。一个服务直接返回字符串,另一个服务返回值类,导致Jackson序列化冲突。通过明确映射id和字符串进行了修复。