You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 07:30:48