Android Kotlin多层嵌套sealed class接收事件无法访问属性怎么解决
问题原因及解决方案
核心问题1:构造参数未声明为类成员属性
你定义SegmentationChapterNameClicked时,构造参数chapterName前未添加val关键字,此时它仅为构造方法的入参,不会成为类的公开成员属性,因此实例无法直接访问。
核心问题2:接收函数泛型类型不匹配
你定义的所有HelloBroadcasting子类都继承自MyEvents<Nothing>,但接收函数的参数类型声明为MyEvents<Int>,泛型不匹配会导致智能转换失效,甚至在调用阶段就会出现类型不兼容错误。
修正步骤
- 给需要访问的构造参数添加
val关键字,将其声明为类成员属性 - 将接收函数的泛型参数调整为匹配的类型,比如用星投影
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
相关产品推荐
相关产品推荐

