为何Kotlin值类无法委托给构造参数?
值类接口委托报错的原因解析
你遇到的这个报错,本质是Kotlin值类(@JvmInline标记)的设计限制导致的,和普通类的接口委托逻辑存在差异:
值类的核心特性限制
值类的设计目标是极致轻量化,编译时会被内联为底层值的包装,不允许存在额外的成员字段。普通类的接口委托会生成一个隐藏的委托字段来持有被委托对象,但值类的规则禁止这种额外字段——它只能保留唯一的底层值字段。委托表达式的严格要求
编译器报错里的“expression is not a parameter”,这里的“parameter”特指接口类型的构造参数,而非实现了该接口的其他类型。你的代码中value是String类型(它是CharSequence的实现类),但并非CharSequence接口本身,所以不符合值类的委托规则。
如果要让值类通过委托实现CharSequence,需要把构造参数的类型直接声明为CharSequence:
@JvmInline value class SerialNumber(val value: CharSequence) : CharSequence by value { init { require(value.isNotBlank()) } }
这样就能正常编译,因为委托表达式value是接口类型的参数,契合值类的委托要求。
- 为什么普通类可以?
普通类没有值类的内联和字段限制,编译器会自动处理String到CharSequence的委托转发,生成对应的委托逻辑和字段。但这种逻辑会引入额外的对象开销,违背值类的性能优化目标,所以值类禁止这种间接委托方式。
内容的提问来源于stack exchange,提问作者Duncan McGregor
相关产品推荐
相关产品推荐

