Kotlin 密封类(sealed class)是一种限制其子类的类。通过使用密封类,您可以确保在编译时仅允许特定的子类扩展它,从而提高类型安全性。
以下是密封类如何保证类型安全的几个关键点:
- 明确的子类列表:在密封类定义中,明确列出所有允许的子类。这使得编译器能够在编译时检查哪些类可以继承密封类,从而避免使用未授权的子类。
sealed class Shape { data class Circle(val radius: Double) : Shape() data class Rectangle(val width: Double, val height: Double) : Shape() }
在这个例子中,Shape
是一个密封类,它只允许 Circle
和 Rectangle
作为其子类。任何其他类尝试继承 Shape
都将导致编译错误。
-
禁止匿名子类:密封类不允许创建匿名子类。这意味着你不能在运行时动态地创建一个新的子类实例,而必须使用已定义的子类。这有助于减少运行时的类型错误。
-
使用
when
表达式:当使用when
表达式处理密封类实例时,编译器会确保每个分支都处理一个有效的子类类型。这有助于避免在when
表达式中出现未处理的子类,从而提高代码的可读性和健壮性。
fun printShape(shape: Shape) {
when (shape) {
is Shape.Circle -> println("Circle with radius ${shape.radius}")
is Shape.Rectangle -> println("Rectangle with width ${shape.width} and height ${shape.height}")
}
}
在这个例子中,printShape
函数接受一个 Shape
类型的参数,并使用 when
表达式处理不同的子类类型。由于 Shape
是密封类,编译器会确保 when
表达式中的所有分支都是有效的。
总之,Kotlin 密封类通过限制其子类的数量和类型,以及在编译时进行严格的检查,有助于确保类型安全。