如何通过sealedSubclasses调用密封类子类对象的重写函数?
遍历Kotlin密封类的Object子类并调用重写方法
你可以通过KClass的objectInstance属性获取每个object子类的单例实例,进而调用optTemp()方法。因为你的所有密封类子类都是object单例,这个属性会直接返回对应的实例对象。
修改后的代码示例:
fun main() { // 指定泛型为KClass<out Food>,获得更好的类型安全 val subclasses: List<KClass<out Food>> = Food::class.sealedSubclasses for (foodClass in subclasses) { // 获取object单例实例,安全调用optTemp() foodClass.objectInstance?.let { food -> val temp = food.optTemp() println("${foodClass.simpleName} 的最佳存储温度:$temp℃") } } } // 你的Food密封类及子类代码不变 sealed class Food{ open fun optTemp(): Int{ return 0 } } object Soup : Food() { override fun optTemp(): Int { return 65 } } object Cake : Food() { override fun optTemp(): Int { return 20 } } object Rice : Food() { override fun optTemp(): Int { return 80 } } object Meat : Food() { override fun optTemp(): Int { return 60 } }
关键说明:
sealedSubclasses返回密封类所有直接子类的KClass集合,通过objectInstance可获取每个object子类的单例实例。- 使用
?.let做安全调用,避免密封类中存在非object子类(比如普通class)时出现空指针问题(你的场景虽不存在,但这是更严谨的写法)。 - 将泛型从
KClass<*>改为KClass<out Food>,能让编译器自动识别实例类型为Food,无需额外类型转换。
运行代码后,会依次输出每个食物子类的最佳温度。
内容的提问来源于stack exchange,提问作者user3145047
相关产品推荐
相关产品推荐

