Kotlin 密封类与接口

密封的类和接口表示受限制的类层次结构,这些层次结构提供了对继承的更多控制;在定义密封类的模块和包之外,不能出现其他子类;密封类的每个实例都有一个来自有限集的类型,该类型在编译此类时是已知的;一旦编译了具有密封接口的模块,就不会出现新的实现

密封类类似于枚举类:枚举类型的值集也受到限制,但每个枚举常量仅作为一个实例存在,而密封类的子类可以有多个实例,每个实例都有自己的状态

使用 sealed 声明密封的类或接口

Kotlin 复制代码
sealed interface Error

sealed class IOError(): Error

class FileReadError(val file: File): IOError()
class DatabaseError(val source: DataSource): IOError()

object RuntimeError : Error

使用密封类的关键好处在于使用 when 表达式的时候;如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句

Kotlin 复制代码
fun log(e: Error) = when(e) {
    is FileReadError -> { println("Error while reading file ${e.file}") }
    is DatabaseError -> { println("Error while reading from database ${e.source}") }
    is RuntimeError ->  { println("Runtime error") }
    // 不再需要 `else` 子句,因为已经覆盖了所有的情况
}
相关推荐
JMchen5 小时前
第 2 篇|Kotlin 进阶 —— 集合、循环与条件表达式
android·kotlin
YB137514 小时前
Kotlin 三类关键字
kotlin
撩得Android一次心动21 小时前
Jetpack Compose 知识点整理1【个人用】
android·学习·kotlin·android jetpack·compose
ForteScarlet1 天前
Kotlin 2.4.20 现已发布,新特性多不多?
android·java·开发语言·开源·kotlin·jetbrains
JMchen1231 天前
Cursor高阶玩法:.cursorrules编写与Spec-Driven开发实战,把AI调教成专属结对编程搭档
人工智能·vscode·kotlin·cursor·结对编程·spec-driven·.cursorrules
hai_android1 天前
Kotlin 协程作用域源码剖析
android·kotlin
leluckys1 天前
【KMP】-KMP 项目commonMain、androidMain、iosMain 到底放什么?
kotlin
JMchen1231 天前
2026年六款主流AI编程工具深度实测:Cursor、Copilot、Claude Code等对比与选型思考
android·kotlin·copilot·ai编程·开发工具·cursor·claude code
hai_android1 天前
Kotlin 协程上下文:从 plus 到 CombinedContext,彻底搞懂左偏结构
android·kotlin
Android打工仔2 天前
Kotlin 协程源码解析(七)`delay()` 到底是如何在 `Dispatchers.Main` 上恢复的?
android·kotlin