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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:22:38