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 密封类通过限制其子类的数量和类型,以及在编译时进行严格的检查,有助于确保类型安全。