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

KotlinKotlin Sealed 密封 ( 密封声明 | 密封子类定义 | 密封特点 | 代码示例 )

密封作用 : 定义一个密封 , 该类只能有有限个指定子类 , 不能在其它文件定义其它类型子类 ; 2 ....子类声明 : 密封子类 , 必须定义在密封内部 ; ( 1.1 之后版本可以定义在同一个文件 ) sealed class Student { class GoodStudent...密封子类 : ① 定义在密封内部 ( 推荐 ) : 密封子类建议定义在密封内部 , 可以兼容所有版本 ; ② 定义在密封所在文件 : Kotlin 1.1 以后版本 , 可以将密封子类定义在密封声明同一个文件...密封子类 : 密封子类也可以被继承 , 其孙子类没有继承限制 , 可以在其它中继承定义 ; 5 . when 语句 : 在 when 语句中判定 , 必须有 else 其它情况进行兜底 , 但是判定密封子类时..., 如果 when 列举了所有的密封子类 , 此时可以不写 else 分支 , 详情看下面的示例代码 ; IV .

85410
您找到你想要的搜索结果了吗?
是的
没有找到

Kotlin Vocabulary | 密封 sealed class

/video/BV1Nk… 密封基本使用 和抽象类似,密封可用于表示层级关系。...子类可以是任意: 数据Kotlin 对象、普通,甚至也可以是另一个密封。但不同于抽象是,您必须把层级声明在同一文件,或者嵌套在内部。...when(result){ is Result.Success -> { } is Result.Error -> { } }.exhaustive IDE 自动补全 由于一个密封所有子类型都是已知...synthetic method public Result(DefaultConstructorMarker $constructor_marker) { this(); } } 复制代码 密封元数据中保存了一个子类列表...Result 是一个抽象,并且包含两个构造方法: 一个私有的默认构造方法 一个合成构造方法,只有 Kotlin 编译器可以使用 这意味着其他无法直接调用密封构造方法。

1.1K10

Kotlin】常用 Kotlin ② ( 枚举 | 枚举定义函数 | 密封 )

文章目录 一、枚举 二、枚举定义函数 1、枚举定义普通函数 2、枚举定义构造函数 三、密封 一、枚举 ---- Kotlin 中使用 枚举 定义常量 , 枚举定义格式如下 : 枚举常量...枚举 常量名称 ; MALE true 枚举常量 Gender.MALE 是 Gender 一个 实例对象 ; 二、枚举定义函数 ---- 在枚举 , 可以 定义函数 , 包括 普通函数...和 构造函数 ; 1、枚举定义普通函数 通过 枚举 类型常量 ( 实例对象 ) 可以 调用 枚举定义方法 ; 为枚举定义普通函数 : 在枚举 Gender 定义了 log 函数 ,...---- 枚举类型 是一组 子类型 闭集 ; 密封 可以 定义 枚举类型 子类型闭集 , 一个密封可以有多个子类 , 继承密封子类 必须 与 密封在相同 Kotlin 代码文件 ; 密封适用于这种情况..., 要使用枚举特性 , 但是需要在枚举基础上保存多个特性 ; 枚举只能实现简单常量列举 , 如果需要更复杂 子类型闭集 , 则需要使用密封 ; 代码示例 : sealed class Gender

1K10

Java密封介绍

事实上,引入了几个新关键字来支持密封密封和非密封。 这些扩充了继承经典概念,在继承概念,只有一组特定子类才能扩展父。因此,本质上,Final不允许继承。...同时,非final可以由任何子类继承。Sealed介于两者之间,只指定允许继承一些。本编程教程通过代码示例和用例介绍了JavaSealed用法和概念。 什么是Java继承?...D 不能继承 A 注意,允许被声明为final。这意味着允许子类不能进一步继承。然而,除了final关键字之外,我们可以使用其他子句,例如非密封或与子类密封。...密封子类必须位于同一个命名模块,尽管它们可以位于不同。 对于未命名模块,密封子类必须在同一个包。 Java密封接口 密封接口声明方式与密封几乎相同。...例如: public non-sealed interface AI extends SealedInterface{} 关于Java密封最后思考 JavaSealed和接口引入为Java

1.1K10

Kotlin中级(9)- - - Kotlin之数据密封、内部类.md

但是,我们知道Kotlin枚举枚举常量是受限,因为每一个枚举常量只能存在一个实例 但是其和枚举不同地方在于,密封一个子类可以有可包含状态多个实例。...也可以说成,密封是包含了一组受限集合,因为里面的都是继承自这个密封。但是其和其他继承(open)区别在,密封可以不被此文件外被继承,有效保护代码。...但是,其密封子类扩展是是可以在程序任何位置,即可以不在同一文件下 2.声明 sealed class SealedExpr() 内部类(嵌套) 在实际开发,用到内部类地方是很多。...从声明上看,继承两个单独声明,子类通过(子类:父)继承父,而内部类必须声明在外部类里面,并且用关键字inner标记 从访问上看,继承不能直接访问子类,外部类可以通过“外部类().内部类...()”访问内部类,继承子类能直接访问父公开成员属性及方法,而内部类值能通过this@外部类方式访问外部类属性和方法 从能否覆盖上看,继承子类能覆盖父用open标记属性和方法,内部类不能覆盖外部类属性和方法

1.1K20

详解 Java 17新特性:“密封

下面就来一起认识一下Java 17Sealed Classes。 密封作用 在面向对象语言中,我们可以通过继承(extend)来实现能力复用、扩展与增强。...新手段:密封 为了进一步增强限制能力,Java 17密封增加了几个重要关键词: sealed:修饰/接口,用来描述这个/接口为密封/接口 non-sealed:修饰/接口,用来描述这个..., SupportHero { } 通过sealed关键词和permitspermits关键来定义Hero是一个需要密封,并且它子类只允许为TankHero, AttackHero, SupportHero... expected 这是因为父Hero被sealed修饰之后,sealed密封要求被传递过来,此时子类就必须在sealed、non-sealed、final之间选择一个定义,它们分别代表: sealed...:继续延续密封特性,可以继续指定继承,并传递密封定义给子类 non-sealed:声明这个为非密封,可以被任意继承 final:不允许继承 根据上面的假设需求,第一、第二层稳定,允许第三层具体英雄角色可以后期不断增加新英雄

63730

Java(接口)新类型——密封

密封是Java 17正式支持一个新特性,它让Java继承可以更加细粒度进行控制。今天就来认识一下这个新功能。...密封 在以往Java继承,Java继承控制非常有限,仅能通过final关键字和访问控制符来控制继承。例如final无法被集成;包私有仅仅只能在该包下进行继承。 这显然是不够。...文章密封为统称 密封(接口)可以明确哪些和接口可以对其扩展或实现。你可以通过sealed修饰符来表明某个密封。..."); } } 密封子类类型 在上面示例密封(接口)实现用了final关键字标记,当然密封实现还可以是密封: /** * 密封子类 */ public sealed...❝密封permits关键字声明子类必须是直接子类,不可间接实现。 密封不支持匿名和函数式接口 由于密封必须明确继承实现关系,所以它不支持匿名

1.3K00

Java 17 更新(8):密封终于转正

Java 看 Kotlin 实现了密封,马上给自己搞了密封密封接口,Kotlin 一看也立马支持了密封接口。...Kotlin 从 1.0 开始就有密封,并且对子类定义位置限制从父内部(Kotlin 1.0)到同一个文件(Kotlin 1.1)再到同一个包内(Kotlin 1.5),但实际使用上没有什么特别大变化...—— 直到 Java 也支持密封密封接口,Kotlin 才也对密封接口做了支持。...从定义上来讲,二者密封、接口都是限制直接子类定义,使得直接子类是可数。...密封实际上也是一个很有用特性,我之前在介绍 Kotlin 密封时候也已经提到过不少它用法,感兴趣小伙伴可以看一下这个视频: 就像视频当中提到那样,我们可以用密封实现递归列表: public

1.5K10

Groovy 孵化功能-记录record和密封sealed学习

密封-sealed关键字 密封、接口和特性(traits)限制了哪些子类可以扩展/实现它们。在密封出现之前,层次结构设计者有两个主要选择: 设置一个关键字为final不允许扩展。...在本例,我们允许Shape子类是Circle、Polygon和Rectangle。 而Circle是final标识。所以它不能进行扩展。...Polygon隐式声明是非密封(没有声明默认就是非密封),RegularPolygon显式标记为非密封(使用关键字non-sealed 或者@NonSealed)这意味着我们层次结构可以通过子类进一步扩展...Java没有为密封子类提供默认修饰符,并要求指定final、密封或非密封一个。...目前,Groovy不会检查permittedSubclasses中提到所有是否在编译时可用,并与基密封一起编译。这可能会在Groovy未来版本改变。

86020

JDK8-JDK17新特性(var类型推断、模式匹配、Record、密封

1.8 密封背景:在 Java 如果想让一个不能被继承和修改,这时我们应该使用 final 关键字对进行修饰。...Java 15 尝试解决这个问题,引入了 sealed ,被 sealed 修饰可以指定子类。这样这个就只能被指定继承。...JDK15预览特性:通过密封和接口来限制超使用,密封和接口限制其它可能继承或实现它们其它或接口。具体使用:使用修饰符sealed,可以将一个声明为密封。...密封使用保留关键字permits列出可以直接扩展(即extends)它。...sealed 修饰机制具有传递性,它子类必须使用指定关键字进行修饰,且只能是 final、sealed、non-sealed 三者之一。

2.4K11

Kotlin---扩展

介绍 除了与Java类比这些功能之外,Kotlin还新增了一些新概念 数据(data) 扩展函数 密封(sealed) 匿名 伴生对象(Companion) 数据 通过data关键字来定义数据...而在Kotlin中提供了扩展函数可以来完成这一些操作。 我们可以在使用,通过以下方式来定义扩展函数。但是该扩展函数使用范围仅在这个中使用。...同样,Kotlin也支持扩展属性,与函数类似定义。 密封 密封用来表示受限制继承结构。由于enum每一个实例都是一个常量,所以密封被开发,密封子类可以有多个实例。...声明密封后,也可以定义多个子类,但是这些子类都需要在与密封类同一个文件。...Java可以通过new关键字创建匿名,而Kotlin则通过object关键字来定义匿名

57530

Java 8之后新特性(九):密封与接口 Sealed Classes and Interfaces

而在实际场景,我们经常会用上抽象与继承这个面向对象特性。 子类可以继承父,从而编写子类独特属性与行为,任何依赖父业务,子类都可以替换掉它,这就是里氏替换原则。...密封与接口 密封是这样一种概念,它在允许抽象与继承基础之上,添加约束限制。 密封或接口,允许你对于可实现或可继承进行约束,以防止继承或实现被突破 还是以代码来展示更为直接。...密封 //使用sealed关键字表明这是一个密封 public abstract sealed class Week //使用permits关键字来约束允许子类或实现...定义一个密封密封接口原则是: • 使用sealed关键字来修饰class,表明这是一个密封 • 使用permits关键字来对可实现子类进行约束 记住,或接口,都可以使用sealed关键字...另外,关于sealed class这个特性,在Kotlin,TypeScript中都有,理念与实现都非常相似,就不重复介绍了。 END 关于sealed class,概念上大家知道这么多就可以了。

1.1K30

CA1047:不要在密封类型声明受保护成员

值 规则 ID CA1047 类别 设计 修复是中断修复还是非中断修复 非中断 原因 公共类型是 sealed(在 Visual basic 为 NotInheritable),并声明了一个受保护成员或受保护嵌套类型...此规则不报告 Finalize 方法冲突,这些方法必须遵循此模式。 规则说明 类型声明受保护成员,使继承类型可以访问或重写该成员。...按照定义,不能从密封类型继承,这表示不能调用密封类型上受保护方法。 对于此错误,C# 编译器会发出警告。 如何解决冲突 若要解决此规则冲突,请将成员访问级别更改为专用,或使该类型可继承。...包含特定 API 图面 你可以仅为此规则、为所有规则或为此类别所有规则配置此选项(设计)。 有关详细信息,请参阅代码质量规则配置选项。...包含特定 API 图面 你可以根据代码库可访问性,配置要针对其运行此规则部分。

59030

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

=构建者模式; 关于 arrayOf() 使用细节。 好了,让我们开始吧! 密封小细节 密封用来表示受限继承结构:当一个值为有限几种类型、而不能有任何其他类型时。...在某种意义上,他们是枚举扩展:枚举类型值集合也是受限,但每个枚举常量只存在一个实例,而密封一个子类可以有可包含状态多个实例。...摘自Kotlin中文文档 关于它用法,我们具体不再做赘述。 密封虽然非常实用,经常能成为我们多type绝佳搭配,但其中却藏着一些使用小细节,比如 构造函数传值所导致损耗问题。...错误示例 sealed 初始化 如题,我们有一个公用属性 sum ,为了便于复用,我们将其抽离到 Fruit 构造函数,让子类便于初始化时传入,而不用重复显式声明。...♂️ 答案是可以,我们利用 接口 改造即可,如下所示: 如上所示,我们增加了一个名为 IFruit 接口,并让 密封 实现了这个接口,子类默认在构造函数实现该属性即可。

76930

JDK17密封sealed和permits使用指南:什么是Javasealed和permits?

Sealed,作为Java 17一个重要新特性,提供了一种机制来精确控制继承链。...这种类设计意图是为了让设计者能够明确规定哪些能够继承或实现该类,从而在Java面向对象编程引入了更高层次封装性和安全性。...通过permits关键字,Java程序员能够构建更加精确控制层次结构,从而在设计模式和代码逻辑引入更多灵活性和可靠性。...这种限制不仅有助于防止库滥用和意外扩展,还能确保库每个形状都符合特定规范和要求,从而提高了整个库可靠性和一致性。...这样,我们可以确保图形库形状类型是受控。 小结 Sealed和permits关键字提供了一种强大方法来精确控制Java继承。

37110

Kotlin学习笔记(四)-面向对象

final,如果想要被子类继承,需要加open关键字修饰; 子类覆写父方法时需要加关键字override修饰 用open表示父方法有默认实现 子类可以有super.work 用abstract表示不可以有默认实现...} 伴生对象与静态成员 kotlin 时没有static 这种方法修饰静态方法 所以要实现 类似于java静态属性就要用到伴生对象 例子: fun main(args: Array<String...枚举定义方法,那么要在枚举对象最后加上; 这基本是Kotlin唯一一个需要强制写;地方 密封 密封与枚举区别:前者是子类可数,后者是实例可数 密封(Sealed Class)子类必须和父定义在同一个文件...密封子类是可数,因为子类只能在父内部或者和父处于同一个文件,在其他地方是无法创建子类。...这个可数定义就是有限 一目了然知道 结语 记过这4篇文章学习,基本已经掌握Kotlin基本语法和对Java对比,也顺带复习了一下Java知识,下一篇我们来学习一些关于Kotlin高阶函数

82310

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

上一篇文章介绍了Kotlin几种开放性修饰符,以及如何从基派生出子类,其中提到了被abstract修饰抽象。...为解决枚举值判断多余分支问题,Kotlin提出了“密封概念,密封就像是一种更加严格枚举,它内部有且仅有自身实例对象,所以是一个有限自身实例集合。...见识了数据深厚功力,再来看看它代码是怎么定义: //数据必须有主构造函数,且至少有一个输入参数, //并且要声明与输入参数同名属性,即输入参数前面添加关键字val或者var, //数据不能是基也不能是子类...这个问题在Java是通过模板(也叫做泛型)来解决,例如常见容器ArrayList、HashMap均是模板,Android开发异步任务AsyncTask也是模板。...() } 总结一下,本文介绍了Kotlin六种特殊函数,首先嵌套和内部类都定义在某个外部类内部,区别在于能否访问外部类成员;其次枚举密封都提供了有序枚举值集合,区别在于密封定义更加严格

1.3K30
领券