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

Android Kotlin多层嵌套sealed class接收事件无法访问属性怎么解决

问题原因及解决方案

核心问题1:构造参数未声明为类成员属性

你定义SegmentationChapterNameClicked时,构造参数chapterName前未添加val关键字,此时它仅为构造方法的入参,不会成为类的公开成员属性,因此实例无法直接访问。

核心问题2:接收函数泛型类型不匹配

你定义的所有HelloBroadcasting子类都继承自MyEvents<Nothing>,但接收函数的参数类型声明为MyEvents<Int>,泛型不匹配会导致智能转换失效,甚至在调用阶段就会出现类型不兼容错误。


修正步骤

  1. 给需要访问的构造参数添加val关键字,将其声明为类成员属性
  2. 将接收函数的泛型参数调整为匹配的类型,比如用星投影MyEvents<*>适配所有子类型

修正后的代码示例

密封类修正:

sealed class MyEvents<out T : Any>{
    sealed class HelloBroadcasting<out T : Any> : MyEvents<Nothing>() {
        sealed class FeatureSegments : HelloBroadcasting<Nothing>() {
            class SegmentationCourseSeekChapterChange(val context: Context) : FeatureSegments()
            // 给chapterName添加val关键字声明为成员属性
            class SegmentationChapterNameClicked(val context: Context, val chapterName: String) : FeatureSegments()
            class SegmentationChapterSelectionFromChapterList(val context: Context) : FeatureSegments()
        }
    }
}

接收函数修正:

// 将参数类型改为MyEvents<*>适配所有子类型
fun sendCleverTapEvent(event: MyEvents<*>) {
        when(event){
            is MyEvents.HelloBroadcasting.FeatureSegments.SegmentationChapterNameClicked -> 
                // 此时可以正常访问chapterName属性
                test(event.context, event.chapterName)
            is MyEvents.HelloBroadcasting.FeatureSegments.SegmentationChapterSelectionFromChapterList -> TODO()
            is MyEvents.HelloBroadcasting.FeatureSegments.SegmentationCourseSeekChapterChange -> TODO()
        }
    }

可选优化

如果你的业务场景不需要用到MyEvents的泛型参数,可以直接去掉泛型定义,减少不必要的类型匹配问题:

sealed class MyEvents{
    sealed class HelloBroadcasting : MyEvents() {
        sealed class FeatureSegments : HelloBroadcasting() {
            class SegmentationCourseSeekChapterChange(val context: Context) : FeatureSegments()
            class SegmentationChapterNameClicked(val context: Context, val chapterName: String) : FeatureSegments()
            class SegmentationChapterSelectionFromChapterList(val context: Context) : FeatureSegments()
        }
    }
}

内容的提问来源于stack exchange,提问作者Devrath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:15:04