kotlin 对接口感到困惑

wljmcqd8  于 2023-06-24  发布在  Kotlin
关注(0)|答案(1)|浏览(102)

这段代码在我只使用对象时工作,但是当我使用瓦尔而不是对象时,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
}
wyyhbhjk

wyyhbhjk1#

val在接口类型上定义了一个属性,而object定义了一个新的类型,而不是变量/属性。
实际上,可能会让您对对象感到困惑的是,它们的名称不仅定义了一个类型,而且还定义了访问该类型的唯一值的方法。因此,当Loading被声明为object时,MarsUiState.Loading * 既是 * 类型又是值,并且可以在Kotlin语法中需要类型的地方使用(比如函数定义中的参数类型,或者函数的返回类型),并且在需要表达式/值的地方,比如赋值语句的右侧,也可以使用 alsoval x = expression)或函数调用的参数(myFun(expression))。
在这里使用val意味着MarsUiState有一个名为Loading的 * 属性 *,因此MarsUiState的任何示例都必须有一个该属性的值(而Success子类型不尊重这一点,因此您会得到一个错误)。但这说不通啊。
这里的要点是说MarsUiState类型的示例可以是3个子类型之一:SuccessErrorLoading。所以这三个东西也必须是类型(类或对象--它们也是类,它们只有一个示例)。

相关问题