Kotlin 密封类和接口

文章目录

定义

密封类和接口使用sealed修饰。

密封类和接口与其直接 子类只能位于同一包内(一般是同一文件夹中,也可以是不同文件夹,package声明为同样的包名):

kt 复制代码
sealed class Route(val id: String)


// 直接子类
class MyRoute(id: String): Route(id)
// 间接子类
class OtherRoute(id: String): MyRoute(id)


sealed interface WaterState

实例化对象

可以使用data object声明密封类或接口的对象(v1.9某个版本之前是用object):

kt 复制代码
sealed class Route(val id: String) {
    data object Home: Route("Home")
}


sealed interface WaterState {
	abstract val name: String


    data object Liquid: WaterState {
        override val name = "液态"
    }


    data object Gaseous: WaterState {
        override val name = "气态"
    }
    
    
    data object Solid: WaterState {
        override val name = "固态"
    }
}

不能直接实例化密封类或接口的对象(因为其构造函数的可见性修饰符是protected,并且 Kotlin 限制sealed不能初始化,得用data object继承的方式创建对象)。

kt 复制代码
fun main() {
    // 这是不被允许的
    // val myRoute = object : Route() {}
    // val myRoute = Route()
}

如果你一定要这样做,可以考虑使用类继承将修饰符改为public:

kt 复制代码
sealed class Route(val id: String) {
    data object Home: Route("Home")
}


class MyRoute(id: String): Route(id)


fun main() {
    print(MyRoute("MyRoute") is Route)
}
复制代码
true

when 分支判定

当when必须将全部情况罗列,并且是对于密封类对象时,如果将全部分支给出,则无需给出else分支(跨平台项目例外):

kt 复制代码
sealed class Route(val id: String) {
    data object Home: Route("Home")
}


class MyRoute(id: String): Route(id)


// 此时分支必须全部给出,给不全要使用 else 收尾
fun checkRoute(route: Route): String = when(route) {
    Route.Home -> "Home"
    is MyRoute -> "MyRoute"
}


fun main() {
    print(checkRoute(MyRoute("Route")))
}
复制代码
MyRoute
相关推荐
灿飞16 小时前
Kotlin与Java虚拟机七:空安全:把十亿美元的错误消灭在类型系统里
java·kotlin
俩个逗号。。2 天前
Kotlin flow 详解
android·开发语言·kotlin
灿飞2 天前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
alexhilton2 天前
提升 Android Compose 页面的流畅度
android·kotlin·android jetpack
灿飞3 天前
Kotlin与Java虚拟机四:一段代码的完整旅程
kotlin
Kapaseker3 天前
Kotlin 2.5 Value Class 终于能放多个属性了
android·kotlin
传奇开心果编程3 天前
【Jetpack Compose娓娓道来】第29课:状态容器与UI事件建模——把“散装状态”变成“可穷举的契约”
android·kotlin·移动开发·android jetpack·ui框架·开发范式·声明式ui
我是唐青枫5 天前
Kotlin Inheritance(继承)详解:语法、原理、实战 Demo
开发语言·kotlin
Goway_Hui6 天前
【KMP for OpenHarmony】-- 在鸿蒙工程中使用 Apollo-Kotlin
华为·kotlin·harmonyos
释厄6236 天前
AI 军备竞赛悖论——为 AI 卖游戏但 AI 需要游戏母场景
人工智能·游戏·kotlin