Kotlin关键字一览表

表中录入kotlin语言的常见关键字并按照字母排序,链接取自Kotlin语言中文站。如有疏漏或错误,欢迎指正。
关键字说明
abstract抽象声明,被标注对象默认是open
annotation注解声明
by类委托属性委托
class声明类
companion伴生对象声明
const声明编译期常量
constructor声明构造函数
crossinline标记内联函数的lambda表达式参数,标识该lambda函数返回为非局部返回,不允许非局部控制流
data数据类,声明的类默认实现equals()/hashCode()/toString/copy()/componentN()
enum声明枚举类
field属性的幕后字段
fun声明函数
import导入
in修饰类型参数,使其逆变:只可以被消费而不可以被生产
init初始化块;相当于主构造函数的方法体
inline声明内联函数
inner标记嵌套类,使其成为内部类:可访问外部类的成员
interface声明接口
internal可见性修饰符,相同模块内可见
lateinit延迟初始化,避免空检查
noinline禁用内联,标记内联函数不需要内联的参数
object对象表达式、对象声明
open允许其它类继承;kotlin类默认都是final,禁止继承
operator标记重载操作符的函数
out修饰类型参数,使其协变:只可以被生产而不可以被消费
override标注复写的方法、属性
package包声明
private可见性修饰符,文件内可见
protected可见性声明,只修饰类成员,子类中可见
publickotlin默认的可见性修饰符,随处可见
reified限定类型参数,需要配合inline关键字使用
sealed声明密封类,功能类似枚举
super访问超类的方法、属性
suspend声明挂起函数,该函数只能从协程和其他挂起函数中调用
throw抛异常
typealias声明类型别名
val声明只读属性
var声明可变属性
vararg修饰函数参数:声明为可变数量参数
<think>我们正在讨论Kotlin的`sealed`关键字。根据用户要求,我们需要解释其用途和用法,并提供示例。引用[1]提到的是数据类(dataclass),但用户的问题是关于`sealed`关键字的,因此我们需要专注于`sealed`。首先,`sealed`关键字Kotlin中用于声明一个密封类(sealedclass)。密封类用于表示受限制的类层次结构,即一个类可以有有限的一组子类,且这些子类必须在与密封类相同的文件中声明(在Kotlin1.1之后,子类也可以出现在同一个编译单元的其他文件中,但通常还是限定在同一个文件中或通过嵌套的方式)。主要用途:1.限制继承:密封类允许你定义一组固定的子类,这样在`when`表达式中处理所有情况时,可以确保覆盖所有可能的情况(如果覆盖了所有子类,则不需要`else`分支)。2.增强类型安全:由于所有可能的子类都是已知的,编译器可以检查是否处理了所有情况。示例:假设我们有一个表示网络请求结果的密封类,它有两个子类:成功和错误。使用密封类定义: ```kotlinsealed classResult<out T: Any> {dataclass Success<outT :Any>(val data: T) :Result<T>()data classError(valexception:Exception): Result<Nothing>() }```然后,我们可以使用`when`表达式来处理结果: ```kotlinfunhandleResult(result:Result<Data>){when (result){is Result.Success-> {//处理成功情况,可以访问result.dataprintln("Success: ${result.data}")}is Result.Error ->{//处理错误情况println("Error: ${result.exception}")}} }```由于`Result`是密封类,只有两个子类,所以`when`表达式覆盖了所有情况,不需要`else`分支。注意:在Kotlin1.0中,密封类的子类必须嵌套在密封类内部。在Kotlin1.1中,子类可以定义在密封类同一个文件的任何地方。另一个常见用途是表示状态,例如UI状态:```kotlinsealed classViewState {objectLoading :ViewState()data classContent(valitems: List<String>): ViewState()dataclass Error(val message: String) :ViewState() }```然后,在更新UI时: ```kotlinfunupdateUI(state:ViewState) {when(state) {isViewState.Loading-> showLoading()isViewState.Content ->showContent(state.items)is ViewState.Error-> showError(state.message)}} ```同样,由于是密封类,我们处理了所有可能的状态。总结: -密封类用于表示有限的类层次结构。-在`when`表达式中处理密封类的实例时,如果覆盖了所有子类,则不需要`else`分支。-密封类本身是抽象的,不能直接实例化。相关问题:1.密封类和枚举类有什么区别?2.在Kotlin中,密封类与抽象类有何不同?3.如何为密封类添加新的子类?4.密封类在Kotlin中有哪些实际应用场景?</think>### Kotlin `sealed`关键字的用途与用法 `sealed`关键字用于声明**密封类**(sealed class),这是Kotlin中一种特殊的抽象类,主要解决两个核心问题: #### 核心特性 1. **受限继承** 密封类的所有直接子类必须在**同一个文件**中声明(Kotlin 1.1+允许在同一个编译单元的其他文件中声明),形成封闭的类层次结构: ```kotlin sealed class Result<out T> { data class Success<T>(val data: T) : Result<T>() data class Error(val message: String) : Result<Nothing>() } ``` 2. **完备性检查** 配合`when`表达式时,编译器能验证是否覆盖所有子类(无需`else`分支): ```kotlin fun handle(result: Result<String>) = when(result) { is Result.Success -> println(result.data) is Result.Error -> println("Error: ${result.message}") // 无需else,编译器确认覆盖所有情况 } ``` #### 典型应用场景 1. **状态机建模**(如UI状态) ```kotlin sealed class LoginState { object Idle : LoginState() object Loading : LoginState() data class Success(val user: User) : LoginState() data class Failed(val error: Throwable) : LoginState() } ``` 2. **表达式树处理** ```kotlin sealed class Expr { data class Const(val num: Int) : Expr() data class Sum(val left: Expr, val right: Expr) : Expr() } fun eval(expr: Expr): Int = when(expr) { is Expr.Const -> expr.num is Expr.Sum -> eval(expr.left) + eval(expr.right) } ``` 3. **API响应封装** ```kotlin sealed class ApiResponse<out T> { data class Success<T>(val data: T) : ApiResponse<T>() data class Failure(val code: Int) : ApiResponse<Nothing>() } ``` #### 与枚举的区别 | 特性 | 密封类 | 枚举类 | |--------------|---------------------------|---------------------| | 实例差异 | 子类可携带不同数据(如`data class`) | 所有实例类型相同 | | 状态数量 | 子类数量固定但实例数量不限 | 实例数量固定 | | 使用场景 | 需携带异构数据的受限类型 | 纯状态标识 | > 密封类本质是**抽象类**,不能直接实例化,其构造函数默认`protected`[^1]。 #### 版本演进 - **Kotlin 1.0**:子类必须嵌套在密封类内部 - **Kotlin 1.1+**:允许子类在**同一文件**的顶层声明 - **Kotlin 1.5+**:支持密封接口(`sealed interface`) --- ### 相关问题 1. 密封类与枚举类在状态管理中的具体选择标准是什么? 2. 如何在多文件项目中合理组织密封类及其子类? 3. 密封类在函数式编程中有哪些典型应用模式? 4. Kotlin的密封接口(sealed interface)解决了哪些密封类的限制? [^1]: 密封类通过受限继承保证类型安全,常用于替代枚举类扩展带数据的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值