当前位置: 首页> 房产> 建筑 > Kotlin 密封类和接口

Kotlin 密封类和接口

时间:2025/7/14 18:39:59来源:https://blog.csdn.net/weixin_67575670/article/details/139305843 浏览次数:0次

文章目录

  • 定义
  • 实例化对象
  • when 分支判定

定义

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

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

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):

sealed class Route(val id: String) {data object Home: Route("Home")
}sealed interface WaterState {abstract val name: Stringdata 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继承的方式创建对象)。

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

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

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分支(跨平台项目例外):

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
关键字:Kotlin 密封类和接口

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: