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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:27:18