在kotlin中被sealed关键字修饰的类就是密封类,当值只能从有限的集合(受限的层次结构)中包含一个类型时,将使用密封类。为了理解这个概念先举个栗子:

class Expr
class Const(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Exprfun eval(e: Expr): Int =when (e) {is Const -> e.valueis Sum -> eval(e.right) + eval(e.left)else ->  throw IllegalArgumentException("Unknown expression")}

在上面的程序中,基类 Expr 有两个派生类 Const (表示一个数字)和 Sum (表示两个表达式的和)。在这里,必须使用 else 分支来处理when表达式中的默认条件。

现在,如果从Expr类派生一个新的子类,则编译器将不会检测到任何东西,因为 else 分支会对其进行处理,就会抛出"Unknown expression"异常而导致错误。

要解决此问题,可以使用密封类。 如前所述,密封类限制了创建子类的可能性。 而且,在when表达式中处理密封类的所有子类时,不必使用else分支:

sealed class Expr
class Const(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
object NotANumber : Expr()fun eval(e: Expr): Int =when (e) {is Const -> e.valueis Sum -> eval(e.right) + eval(e.left)is NotANumber -> java.lang.Double.NaN}

而且密封类是抽象类,它无法被外部实例化,它的继承也会被限制,所有的实现都只能由其内部的子类去完成。

不同kotlin迭代版本中密封类的进化史:

https://blog.csdn.net/vitaviva/article/details/117938161

枚举和密封类之间的区别

枚举类和密封类非常相似,枚举类型的值集也像密封类一样受到限制;

他们的区别是,枚举只能有一个实例,而密封类的子类可以有多个实例,并且密封类的子类可以携带自己独有的状态参数以及行为方法来记录更多的实现信息以完成更多的功能,这是枚举类所不具备的。

Kotlin 密封类相关推荐

  1. kotlin密封类_Kotlin密封级

    kotlin密封类 In this tutorial, we'll be looking into Kotlin Sealed Class. What are they? What's their u ...

  2. 理解Kotlin密封类Sealed

    " 密封类和接口表示受限制的类层次结构,提供对继承的更多控制.密封类的所有直接子类在编译时都是已知的.在定义密封类的模块和包之外不能出现其他子类.例如,第三方客户端不能在其代码中扩展您的密封 ...

  3. Kotlin 密封类代替枚举类

    密封类代替枚举类 在Kotlin中由于密封类的特性,所以可以完全取代枚举类 应为object是final类,所以不能继承普通类,但是密封类是abstract,所以可以继承 示例中使用了中缀符号infi ...

  4. kotlin sealed 中_7.8 Kotlin Sealed类

    密封(Sealed)类是一个限制类层次结构的类. 可以在类名之前使用sealed关键字将类声明为密封类. 它用于表示受限制的类层次结构. 当对象具有来自有限集的类型之一,但不能具有任何其他类型时,使用 ...

  5. BeginnersBook Kotlin 教程

    来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request. 请您勇敢地去翻译和改 ...

  6. kotlin_基础_密封类(sealed)

    原文链接:https://blog.csdn.net/weixin_41953808/article/details/112499887 Kotlin密封类:sealed 密封类:用来定义受限的类继承 ...

  7. 8.1 Kotlin Sealed类

    文章目录 密封类声明 密封类的必要性 Kotlin 密封类示例 密封(Sealed)类是一个限制类层次结构的类. 可以在类名之前使用sealed关键字将类声明为密封类. 它用于表示受限制的类层次结构. ...

  8. kotlin跨平台_探索Kotlin跨平台第1部分

    kotlin跨平台 介绍 (Introduction) Kotlin makes Android development more fun. If you search the web, you'll ...

  9. Kotlin相关面试题

    目录 一.请简述下什么是kotlin?它有什么特性? 二.密封类与枚举的区别? 三.Kotlin 中注解 @JvmOverloads 的作用? 四.Kotlin中的MutableList与List有什 ...

  10. Google 宣布废弃 LiveData.observe 方法

    本篇文章作为技术动态了解即可,废弃 LiveData.observe() 扩展方法,已经不是什么新的新闻了,在很久以前,Google 废弃掉这个方法的时候,第一时间我在 朋友圈 和 掘金沸点 发过一个 ...

最新文章

  1. python的输入和格式输出
  2. jenkins-sonar 静态扫描阶段 连接svn 报错
  3. LeetCode20——Valid Parentheses(括号匹配问题,使用栈的知识)
  4. 关于miniconda的安装,配置以及包批量安装和使用
  5. cosin等于多少_cos0等于多少?
  6. MySQL04:DDL数据定义语言
  7. Opencv之形状距离匹配--createShapeContextDistanceExtractor
  8. 三菱mode bus tcp通讯_邢台三菱MR-J4-200B4
  9. mui toast自定义样式
  10. fenby C语言 P17
  11. Python函数学习心得
  12. TX-LCN优化介绍
  13. C#计算wgs84大地坐标转换为空间直角坐标
  14. 【改变键盘上方向键蹩脚的位置】通过autohotkey脚本实现键盘按键重映射【便利码代码】--以上下左右键映射为capslock与hjkl组合的按键 【附源码】
  15. HTML+CSS实战(哈罗单车首页)
  16. 统计名著中汉字出现频率
  17. win10开机有东西一闪而过_Win10 开机以后不一会儿会弹出一个黑框,usoclient.exe 一闪而过。这东西对电脑有...
  18. 让1.6亿美元的公司导致破产被50万美元贱卖的无解的Python bug
  19. 百分点“数据隧道”玩转大数据平台实时数据复制
  20. CVE-2014-6271-bash shellshock-破壳漏洞复现

热门文章

  1. es文件浏览器鸿蒙,达人教你玩应用:ES文件浏览器之文件互传(原创首发)
  2. Git 打补丁-- patch 和 diff 的使用(详细)
  3. Cholesky分解及一个例子
  4. coreldraw x5 选择工具快捷键_coreldraw x5快捷键大全 coreldraw快捷键分享
  5. 波波腾机器人_GitHub - bobowire/Wireboy.SDK.CQP: C# .net框架的酷Q机器人插件SDK
  6. Maven的setting配置详解
  7. VS2013 百度云资源以及密钥
  8. 正从服务器获取安装包消息 荣耀9,华为荣耀9 root教程 华为荣耀9获取root权限的方法...
  9. python xlwt_python的xlwt模块
  10. 固定表头和固定列表格解决方案