文章目录

  • 密封类声明
  • 密封类的必要性
  • Kotlin 密封类示例
  • 密封(Sealed)类是一个限制类层次结构的类。
  • 可以在类名之前使用sealed关键字将类声明为密封类。
  • 它用于表示受限制的类层次结构。
  • 当对象具有来自有限集的类型之一,但不能具有任何其他类型时,使用密封类。
  • 密封类的构造函数在默认情况下是私有的,它也不能允许声明为非私有。

密封类声明

在类名之前使用sealed关键字将类声明为密封类。

sealed class MyColor {}

密封类的子类必须在密封类的同一文件中声明。

sealed class MyColor {class Yellow : MyColor()class Red : MyColor()class Black : MyColor()
}

密封类仅在编译时限制类型集来确保类型安全的重要性。

sealed class MyColor {class Yellow : MyColor()class Red : MyColor()class Black : MyColor()
}sealed class ColorA {class White : MyColor() //不起作用,因为密封类在另一个范围内定义。
}sealed class ColorB : MyColor() {}

密封类隐式是一个无法实例化的抽象类。

sealed class MyColor()fun main(args: Array<String>) {val color = MyColor()   //密封类型无法实例化
}

密封类的必要性

让我们首先了解密封类的必要性,下面的例子中,我们有一个类MyColor,它有三个子类Yellow、Red和Black。evals()方法中的when表达式必须使用else分支,否则我们会得到一个编译错误。
示例1:

open class MyColor {class Yellow : MyColor()class Red : MyColor()class Black : MyColor()
}fun evals(color: MyColor) = when (color) {is MyColor.Yellow -> println("yellow")is MyColor.Red -> println("red")is MyColor.Black -> println("black")else -> println("other")    //必须包含else分支,否则编译错误
}fun main(args: Array<String>) {evals(MyColor.Black())
}

Kotlin 密封类示例

密封类通常与表达时一起使用。 由于密封类的子类将自身类型作为一种情况。 因此,密封类中的when表达式涵盖所有情况,从而避免使用else子句。

sealed class MyColor {class Yellow : MyColor()class Red : MyColor()class Black : MyColor()
}fun evals(color: MyColor) = when (color) {is MyColor.Yellow -> println("yellow")is MyColor.Red -> println("red")is MyColor.Black -> println("black")
}fun main(args: Array<String>) {evals(MyColor.Black())
}

结果:black

8.1 Kotlin Sealed类相关推荐

  1. kotlin sealed 中_7.8 Kotlin Sealed类

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

  2. Kotlin学习笔记(十一)Sealed类和Sealed接口

    最近在看DataStore源码时,看到一种类似于枚举的使用方式.就是Sealed类,但是比枚举类更有扩展性,除了拥有共享属性,还可以持有特征属性. 1.通常限定一些有限集合的状态值.       如: ...

  3. kotlin sealed 中_Kotlin的密封(Sealed)类:超强的枚举(KAD 28)

    Kotlin的密封(Sealed)类:超强的枚举(KAD 28) 作者:Antonio Leiva 时间:Jun 27, 2017 原文链接:https://antonioleiva.com/seal ...

  4. 学习Kotlin(三)类和接口

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  5. kotlin数据类_Kotlin数据类

    kotlin数据类 In this tutorial, we'll look at Kotlin Data Class. If you haven't read the Kotlin Classes ...

  6. kotlin - 数据类data

    kotlin - 数据类data 在kotlin中数据类通过data关键字来修饰. 数据类需满足的条件 主构造器必须至少有一个参数 主构造器中的参数需要用var/val声明为属性 数据类不能用abst ...

  7. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  8. kotlin 扩展类的功能_Kotlin程序| 扩展功能功能

    kotlin 扩展类的功能 扩展功能 (Extension function) Kotlin provides the ability to add more functionality to the ...

  9. Kotlin学习(二)-------绝对震撼你的kotlin数据类-data class

    你所不了解的Kotlin数据类(data class) 回顾Java Java中我们在定义一个POJO,DTO这些要遵循JavaBean原则的实体类的时候,我们要写属性对应的setXxx和getXxx ...

最新文章

  1. 在浏览器中进行深度学习:TensorFlow.js (四)用基本模型对MNIST数据进行识别
  2. 对不起,我的代码评审毁了一个程序员!
  3. RS232 波特率时钟产生方法?
  4. C语言查找单链列表的第k个元素的算法(附完整源码)
  5. Spring事务嵌套引发的问题--Transaction rolled back because it has been marked as rollback-only...
  6. 强化学习(part3)--Q-Learning
  7. golang web php,GitHub - kai-xx/goWeb: golang web 接口实现 -- 类似PHP的laravel
  8. springboot 闪退。falling back to default profiles: default StandardService - Stopping service [Tomcat]
  9. 优先队列默认是小顶堆吗_一分钟带你读懂什么是堆?
  10. 接管任意微软账户并获$5万赏金的故事
  11. MAYA中average normal
  12. Codeforces 659F Polycarp and Hay【BFS】
  13. GB28181国标协议
  14. FPGA硬件加速综述
  15. arm云服务器虚拟安卓,ARM搭建云手机
  16. 算法与数据结构实战实验——线性数据结构实现与应用(使用java)
  17. 微软Azure动手实验营4月课程预告
  18. laravel-excel 表格 文档翻译笔记
  19. HDU 4114 Disney's FastPass(状压dp)
  20. JSONObject、JSONArray方法使用详解

热门文章

  1. 判断字符串是否在base64编码范围内
  2. 动画项目中问题及解决方案(V客学院知识分享)
  3. JetBrain系列软件的学生授权认证及认证到期重新申请授权
  4. 三层架构和SpringMVC概述
  5. iis7.0官方下载 IIS 7.0(微软Web服务器组件IIS 7.0) 官方(windows 2003,XP,2000)
  6. 机器学习关键步骤(四)
  7. 快速云:关于云技术未来的六大趋势
  8. flux 中的 buffer 的原理
  9. MySQL inet aton函数,基于Mysql的IP处理函数inet_aton()与inet_ntoa()的深入分析
  10. 手机html input打开数字,html5 input的type属性启动数字输入法