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

如何在Kotlin中实现类似Rust枚举的多类型值匹配?

Kotlin中类似Rust枚举的多类型值存储方案

当然有,Kotlin里的**密封类(Sealed Class)**就是最接近Rust枚举的方案,完美解决你需要存储多种不同类型必填值的需求。

密封类的核心特性

密封类是一种受限的类层级结构,它的子类只能在同一个文件(Kotlin 1.5及以上支持同一子目录)中定义,这保证了类型的封闭性——就像Rust枚举的成员只能在枚举内部定义一样,外部无法随意扩展,编译器也能据此做穷尽匹配检查。

代码示例:定义多类型存储的密封类

比如你需要存储post、comment、community三种不同类型的必填值,可以这样定义密封类:

// 定义密封类作为父类型
sealed class Content {
    // 每个子类对应一种类型,可携带不同结构的必填数据
    data class Post(val id: Long, val title: String, val content: String) : Content()
    data class Comment(val id: Long, val postId: Long, val text: String) : Content()
    data class Community(val id: Long, val name: String, val description: String) : Content()
}

用when语句做穷尽匹配(类似Rust的match)

和Rust的match一样,Kotlin的when语句针对密封类做匹配时,编译器会强制检查是否覆盖了所有子类分支,避免遗漏:

fun processContent(content: Content) {
    when (content) {
        is Content.Post -> println("处理帖子:ID=${content.id},标题=${content.title}")
        is Content.Comment -> println("处理评论:ID=${content.id},关联帖子ID=${content.postId}")
        is Content.Community -> println("处理社区:ID=${content.id},名称=${content.name}")
    }
}

额外说明

  • 密封类的子类不仅可以是data class,还可以是普通类、单例object等,灵活性拉满;
  • 如果只是需要存储无关联数据的枚举值(不需要携带不同结构的属性),普通的enum class也能满足,但要存储不同类型的必填值时,密封类是最优选择。

内容的提问来源于stack exchange,提问作者dessalines

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:45:34