首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin密封类-为什么编译器不检查所有子类型?

Kotlin密封类是一种特殊的类,用于表示受限的类继承结构。它允许我们定义一组有限的子类,并且在使用密封类时,编译器会强制要求我们处理所有可能的子类型,以确保代码的完整性和安全性。

为什么编译器不检查所有子类型呢?这是因为密封类的设计目的是为了允许扩展子类型,而不会影响到已有的代码。如果编译器强制要求检查所有子类型,那么每次添加新的子类型时,都需要修改所有已有的代码,这将导致代码的脆弱性和可维护性降低。

相反,Kotlin编译器通过使用when表达式来检查密封类的所有子类型。在使用when表达式时,我们需要覆盖所有可能的子类型,并且编译器会在编译时检查我们是否漏掉了某个子类型的处理。这种方式既保证了代码的完整性,又允许我们在需要时轻松地添加新的子类型。

Kotlin密封类的优势在于它提供了一种更安全和更可控的方式来处理受限的类继承结构。它可以帮助我们在编译时捕获一些潜在的错误,并提供更好的代码组织和可读性。

在实际应用中,Kotlin密封类可以用于各种场景,例如表示状态、事件、错误类型等。对于每个子类型,我们可以根据具体的业务需求来定义其特定的行为和属性。

腾讯云提供了丰富的云计算产品和服务,虽然不能直接提及,但可以通过腾讯云的官方文档和产品介绍来了解相关的云计算解决方案。对于Kotlin密封类的应用,可以结合腾讯云的云原生服务、人工智能服务等来实现具体的业务需求。具体的产品和介绍链接地址可以参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin入门(15)独门秘笈之特殊

可是枚举类型实际上是一种,开发者在代码中创建enum类型时,编译器会自动生成一个对应的,并且该类继承自java.lang.Enum。...为解决枚举值判断的多余分支问题,Kotlin提出了“密封”的概念,密封就像是一种更加严格的枚举,它内部有且仅有自身的实例对象,所以是一个有限的自身实例集合。...或者说,密封采用了嵌套的手段,它的嵌套全部由自身派生而来,仿佛一个家谱明明白白列出来某人有长子、次子、三、幺。...//密封确保条件分支覆盖了所有的枚举类型,因此不再需要else分支。...不过正如声明变量那样,如果编译器能够根据初始值判断该变量的类型,就无需显式指定该变量的类型;模板也存在类似的偷懒写法,如果编译器根据输入参数就能知晓参数类型,则调用模板的构造函数也不必显式指定参数类型

1.3K30

Kotlin十周年:Kotlin 1.5稳定版发布——2021年第一个大版本更新有何亮点?

Kotlin 1.5.0 稳定版已发布,此版本提供了稳定的语言特性,例如 JVM records、密封接口 (sealed interface)、内联 (inline class),并引入了新的默认...据介绍,新的编译器Kotlin/Native 和 Kotlin/JS 编译器共享统一的管道和业务逻辑,因此 Kotlin 团队可同时为所有平台实现大多数功能、优化和错误修复。...Kotlin 1.5 主要变化 新增稳定的语言特性 - JVM records、密封接口 (sealed interface)、内联 (inline class) 标准和测试库改进 - 稳定的无符号整数类型...1.5 主要亮点包括: 稳定的语言特性:JVM records、密封接口 ( sealed interface )、内联 ( inline class ) 标准和测试库改进:稳定的无符号整数类型、E...Kotlin/Native 获得了对 linuxX64 和 iosArm64 目标的调试模式下的编译器缓存的支持。它还停用了内置的内存泄漏检查器,以避免可能导致应用程序崩溃的问题。

84130
  • 是时候使用Kotlin编程了

    并且,Kotlin还提供了智能的类型判断功能,使用is类型判断后,编译器自动进行类型转换,父引用可以调用子类接口,注意转换只在is的代码块中生效。...Kotlin为什么可以兼容Java,一个主要原因是Kotlin文件在经过Kotlin编译器编译后会生成Java字节码。...当Kotlin调用Java代码,Kotlin编译器会对调用的Java文件进行分析,以便kt文件能够生成正确的class文件。为什么这么说呢?...例如: 当然,也可以直接在声明的时候指定构造函数,对象实例化可以写new关键字。...this表达式 6.5 小结 第7章 数据密封 7.1 数据 7.1.1 对象复制 7.1.2 序列化 7.1.3 成员解构 7.2 密封 7.3 小结 第8章 集合与泛型 8.1集合 8.1.1

    3.2K10

    Kotlin Vocabulary | 密封 sealed class

    子类可以是任意的: 数据Kotlin 对象、普通的,甚至也可以是另一个密封。但不同于抽象的是,您必须把层级声明在同一文件中,或者嵌套在的内部。...使用 when 语句处理密封时,如果没有覆盖所有情况,可以让编译器给我们一个错误提示。...when(result){ is Result.Success -> { } is Result.Error -> { } }.exhaustive IDE 自动补全 由于一个密封所有类型都是已知的...Result 是一个抽象,并且包含两个构造方法: 一个私有的默认构造方法 一个合成构造方法,只有 Kotlin 编译器可以使用 这意味着其他的无法直接调用密封的构造方法。...,让编译器和 IDE 帮忙避免类型错误吧。

    1.2K10

    追随 KotlinScala,看 Java 12-15 的现代语言特性

    在没有记录类型之前,创建一个具有各字段对应 getter、为所有字段初始化的构造函数、基于所有字段的 equals()/hashCode()/toString() 的简单却需要写一大堆代码,其中大部分都是样板代码...可以实现接口 可以有其内部类型 可以标注注解 记录类型还可以与接下来提到的密封/密封接口很好协作,另外记录还适用于未来版本的模式匹配。...Java 15 引入的密封(sealed class)类似于 Kotlin/Scala 的密封密封接口类似于 Scala 的密封特质(sealed trait)。...不妨将二者统称为密封类型,与普通/接口不同的是,密封类型限定了哪些/接口作为其直接子类型。...permits 显式声明其直接子类型列表,也可以省略——编译器会根据当前文件中的直接子类型的声明推断出来。

    1.3K20

    Kotlin 1.4.30-M1 增强的内联是个什么东西?

    提问:所以你知道为什么 IDE 会对 max 这样的非高阶函数的内联发出警告了吗? 2. 什么是内联 内联函数可以减少对象的创建,内联实际上也是如此。...内联实际上就是对其他类型的一个包装,就像内联函数其实是对一段代码的包装一样,在编译的时候对于内联对象的访问都会被编译器拆掉包装而得到内部真实的类型。...内联的语法其实也简单,与 Kotlin 当中其他的枚举密封、数据的定义方式类似,在 class 前面加一个 inline 即可: inline class PlayerState(val value...直接定义肯定是不行的,因为 PlayerState 是个密封密封本质上也是一个,我们前面提到过内联有不能继承类型的限制,当时给出的理由是内联不能包含其他状态。...这样看来,如果父当中足够简单,包含状态,是不是将来有希望支持继承呢? 其实问题不只是状态那么简单,还有多态引发的装箱和拆箱的问题。

    56830

    Kotlin|这些隐藏的内存陷阱,你应该熟记于心

    密封的小细节 密封用来表示受限的继承结构:当一个值为有限几种的类型、而不能有任何其他类型时。...在某种意义上,他们是枚举的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封的一个子类可以有可包含状态的多个实例。...摘自Kotlin中文文档 关于它用法,我们具体不再做赘述。 密封虽然非常实用,经常能成为我们多type的绝佳搭配,但其中却藏着一些使用的小细节,比如 构造函数传值所导致的损耗问题。...总结 本篇中,我们以日常开发的视角,去探寻了 Kotlin 中那些 [隐藏] 的内存陷阱。 仔细回想,上述的恰当用法都是建立在 [不熟练] 的背景下。...参阅 Kotlin代码检查在美团的探索与实践 关于我 我是 Petterp ,一个三流 Kotlin 使用者,如果本文对你有所帮助,欢迎点赞评论收藏,你的支持是我持续创作的最大鼓励!

    81030

    Kotlin Primer·与对象(上)

    ,可以直接使用,如果你希望别的访问到这个变量,可以用private修饰。...如果你希望你的 有一个公有构造函数,你需要声明一个带有非默认可见性的空的主构造函数。...另外,在 JVM 上,如果主构造函数的所有的参数都有默认值,编译器会生成一个额外的无参构造函数,它将使用默认值。...4.4.2 sealed 密封 sealed 修饰的称为密封,用来表示受限的层次结构。例如当一个值为有限集中的 类型、而不能有任何其他类型时。...在某种意义上,他们是枚举的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封的一个子类可以有可包含状态的多个实例。

    66720

    Kotlin | 一份10万字的随查笔记,妈妈再也担心我不会Ctrl+F了

    { } 程序结构 常量与变量 val 声明常量,类似于 Java 的final 关键字,不可被重复赋值 在Kotlin 里面有类型推导,编译器可以推导量的类型,所以可推导类型定义时可以不用写数据类型...java与Kotlin 互操作 基本互操作 1. 空安全类型 Kotlin空安全类型原理 Kotlin在编译的时候,会增加一个函数调用,会对参数类型,返回值类型进行是否为null的检查 2....几类函数的调用 包级函数:静态方法 在java里并没有这种函数,它在编译的时候,会为Kotlin生成一个,这个包含了所有包级函数,在java看来,这些都只是静态方法,所以在java调用的时候,按照静态按方法调用即可...密封是一种特殊的抽象 密封的子类定义在自身相同的文件中 密封的子类个数有限 简单来说,密封相当于一事物的具体分类,有明确的类型区别,子类有具体个数。...密封 枚举 状态实现 子类继承 实例化 状态可数 子类可数 实例可数 状态差异 类型差异 值差异 内联 inline class 内联是对某一个类型的包装 内联是类似于 Java 装箱类型的一种类型

    2.8K20

    《Kotin 极简教程》第7章 面向对象编程(OOP)(2)《Kotlin极简教程》正式上架:

    这几个注解定义在kotlin/annotation/Annotations.kt中。 7.8.2 使用注解 注解可以用在、函数、参数、变量(成员变量、局部变量)、表达式、类型上等。...7.10.1 为什么使用密封 就像我们为什么要用enum类型一样,比如你有一个enum类型 MoneyUnit,定义了元、角、分这些单位。...在某种意义上,sealed是枚举的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封的一个子类可以有可包含状态的多个实例。...密封所有子类都必须与密封在同一个文件中声明(在 Kotlin 1.1 之前, 该规则更加严格:子类必须嵌套在密封声明的内部): sealed class Expression class Unit...面向对象编程的特性: 与构造函数、抽象与接口、继承以及多重继承等基础知识,同时介绍了Kotlin中的注解、枚举、数据密封、嵌套、内部类、匿名内部类等特性

    1.6K20

    Kotlin修炼指南(四)

    Sealed Class Sealed Class,听上去很高端,密封,实际上并不难理解,它密封的是逻辑,作用就是可以让逻辑更加完善、严谨。...Java中好像并没有这种功能,所以,Kotlin一定是通过编译器的黑魔法来实现的,通过反编译Kotlin的代码,可以发现这个黑魔法。例如上面Map的plus重载运算符,在反编译之后的代码如下所示。...很明显,Kotlin就是在编译的时候,把重载的操作符替换成了前面定义的函数,实际上有点类似拓展函数的实现,所以Java其实本身不支持重载操作符,但是Kotlin通过编译器来实现了操作符的重载。...官方的做法,在自定义的中重载in操作符,例如给正则增加in操作符,用来判断匹配类型,代码如下所示。...Kotlin会遍历初始Collection中所有项目,并复制原始的对象,并将每个元素的age值改为1,再将其添加到新创建的列表中。

    72010

    Dart 3.0 语法新特性 | 类型修饰符 Class modifiers

    theme: cyanosis 在 dart 3.0.0 之后,对类型的修饰符进行了拓展,现在类型的修饰符有: 名称 作用 mixin 混入修饰符 sealed 密封可枚举的子类型 abstract...密封的支持 sealed 有些类型的子类型集是已知的,可枚举的;比如登陆界面的认证状态 AuthState,有如下三种状态 认证中 AuthLoading 认证成功 AuthSuccess 认证失败...AuthFailure 这时就可以通过密封来处理,下面的代码看起来似乎和平台的继承也没什么区别,但密封有它的特点。...,所以在编码过程中如果少写一个,编译器就是显示地给出提示。...类型修饰符的增加,可以让本身多了一些特点,也可以控制的派生能力,这对于构建大型应用来说是友好的。Kotlin 一直都有 sealed 密封,这是让我垂涎的语法特性,现在 Dart 终于支持了。

    92420

    介绍Kotlin第二部分(翻译篇)

    关于Kotlin和lambdas的最好部分是类型推断,当类型匹配时,它就在你的代码下面出现一条红色的线。通过编译器的这种帮助,您可以将精力放在业务逻辑上,而不是试图找出循环应该遍历多少遍。...这个问号在Kotlin的null safe起着重要的作用。如果Kotlin编译器在变量声明或函数参数/返回类型中看到这个问号,它将强制您对空检查。...4、类型: Checking, casting, and safety(检查,转换,安全) 在Java世界中,您可能会遇到这样的if检查if (clazz instanceOf SomeClass)程序员希望看到他们是否正确实现其接口或扩展的基...在Kotlin类型推断是非常好的,编译器在编写代码时给出了很多有用的提示。当您需要检查对象是否是某种类型时,您可以使用is关键字。...class SeaLion: Seal() class Walrus: Seal() class KissFromARose(val film: String): Seal() 如果我们有这样的结构,一个密封的超和三个继承的子类

    98340

    JDK 15已发布,你所要知道的都在这里!

    特性描述 通过 sealed 修饰符将一个声明为密封,permits子句指定允许扩展密封。例如下面的 Shape 声明指定了三个可扩展的子类。...在子类数量很少时,在密封的源文件中声明子类会很方便。当以这种方式声明子类时,密封可以省略 allows 子句,同时 Java 编译器将从源文件中推断允许的子类。...密封可以让代码更简洁,代码可以明确推断出所有允许的子类。比如传统的 if-else 和 instanceof 代码编译器分析起来很困难,无法确定子句是否覆盖了所有允许的子类。...((Square)shape).side() ... } } 在之后支持模式匹配的版本中,编译器可以直接推断出 Shape 所有允许的子类,不需要 default 语句。...JVM 支持 JVM 在运行时识别密封和接口,并防止未经授权的子类和接口扩展密封。 尽管 sealed 关键字是修饰符,但是 ClassFile 中并没有 ACC_SEALED 标志。

    76910

    Kotlin学习日志(五)与对象

    (2)接口的内部方法通常要被实现它的进行重写,所以这些方法默认为抽象类型。 (3)与Java不同的是,Kotlin允许在接口内部实现某个方法,而Java接口的所有内部方法都必须是抽象方法。...的接口与Java的区别在于,Kotlin接口内部允许实现方法 //此时该方法不是抽象方法,就不能加上abstract //不过该方法依然是open类型,接口内部的所有方法都默认是open...提出了“密封”得概念,密封就像是一种更加严格的枚举,它内部有且仅有自身的实例对象,所以是一个有限的自身实例集合,或者说,密封采用了嵌套的手段,它的嵌套全部由自身派生而来,定义密封的时候,需要在该类的...,它的值是一个有限的集合 //密封确保条件分支覆盖了所有的枚举类型,因此不再需要else分支 tv_result.text = when(season)...泛型)声明对象时,要在模板名后面加上"" 0 -> River("小溪",100) //如果编译器根据输入参数就能知晓参数类型

    1.1K20

    第1章 Kotlin是什么第1章 Kotlin是什么

    在大多数情况下, 编译器根据换行符就能够推断语句已经结束。 4.Kotlin中使用fun关键字声明函数(方法),充满乐趣的fun。 1.2 语言特性 人们为什么喜欢Kotlin?...我们可以只写 val number = 23,编译器会去推断这是一个 Int。 数据以极简的方式创建POJO。 运算符重载相当简单。 快速方便地扩展内置、自定义的函数与属性。...Kotlin是一门偏重工程实践与艺术上的极简风格的语言。 2.极简主义( Minimalist ):语法简洁优雅啰嗦,类型系统中一切皆是引用(reference)。...在高级语言中,所有参数都必须严格匹配其类型,这样就不会出现寄存器内容错误的情况。高级语言就是为了解决汇编语言的这些问题进行的更高一层的抽象与封装。这层封装就是编译器。...检查异常是一个失败的实践,几乎所有的主要API提供者都反对可检查异常。Kotlin中摒弃了检查异常。 2.基本类型和数组。Java的这个设计保留了字节码的底层细节,违反了“凡事皆为对象”原则。

    1.3K21
    领券