使用val替代object实现MarsUiState密封接口时编译错误求助
密封接口val声明引发的实现错误解决
问题描述
使用object实现密封接口MarsUiState时代码正常运行,但将Loading改为val声明后,IDE报错:'Class 'Success' is not abstract and does not implement abstract member'
正常运行代码
sealed interface MarsUiState { data class Success(val photos: List<MarsPhoto>) : MarsUiState object Error : MarsUiState object Loading: MarsUiState }
报错代码
sealed interface MarsUiState { data class Success(val photos: List<MarsPhoto>) : MarsUiState object Error : MarsUiState val Loading: MarsUiState }
原因分析
你在密封接口里写的val Loading: MarsUiState是定义了一个抽象属性,而非声明接口的实现类。这要求所有实现MarsUiState的类(比如Success、Error)都必须重写这个Loading属性,因此Success类会因为未实现该抽象成员而报错。
解决方案
如果你的需求是把Loading作为密封接口的一个实现实例,必须用object(或class)声明,而不是val,也就是你之前正常运行的代码写法。
如果确实需要在密封接口中定义属性,那么所有实现类都必须重写该属性,示例如下:
sealed interface MarsUiState { val status: String data class Success(val photos: List<MarsPhoto>, override val status: String) : MarsUiState object Error : MarsUiState { override val status: String = "error" } object Loading : MarsUiState { override val status: String = "loading" } }
内容的提问来源于stack exchange,提问作者Allen J Mathew
相关产品推荐
相关产品推荐

