这段代码在我只使用对象时工作,但是当我使用瓦尔而不是对象时,IDE会给出错误:类“Success”不是抽象的,并且不实现抽象成员。任何帮助将不胜感激。
这工作得很好:
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
}
1条答案
按热度按时间wyyhbhjk1#
val
在接口类型上定义了一个属性,而object
定义了一个新的类型,而不是变量/属性。实际上,可能会让您对对象感到困惑的是,它们的名称不仅定义了一个类型,而且还定义了访问该类型的唯一值的方法。因此,当
Loading
被声明为object
时,MarsUiState.Loading
* 既是 * 类型又是值,并且可以在Kotlin语法中需要类型的地方使用(比如函数定义中的参数类型,或者函数的返回类型),并且在需要表达式/值的地方,比如赋值语句的右侧,也可以使用 also(val x = expression
)或函数调用的参数(myFun(expression)
)。在这里使用
val
意味着MarsUiState
有一个名为Loading
的 * 属性 *,因此MarsUiState
的任何示例都必须有一个该属性的值(而Success
子类型不尊重这一点,因此您会得到一个错误)。但这说不通啊。这里的要点是说
MarsUiState
类型的示例可以是3个子类型之一:Success
、Error
或Loading
。所以这三个东西也必须是类型(类或对象--它们也是类,它们只有一个示例)。