我正在嘗試提出一個允許我執行以下操作的資料模型:
- 定義型別
Task并更改其Status - 這
Status可以是InProgress或者Completed - 在完成的情況下
Status,我希望能夠添加特定于Task已完成的資料。
最初,我想出了這個資料模型:
sealed class Task<R : TaskResult> {
abstract val status: TaskStatus<R>
data class A(
val data: String,
override val status: TaskStatus<NoResult>,
) : Task<NoResult>()
data class B(
val data: String,
override val status: TaskStatus<TaskBResult>,
) : Task<TaskBResult>()
}
sealed class TaskStatus<R : TaskResult> {
object InProgress : TaskStatus<NoResult>()
data class Completed<R : TaskResult>(val result: R) : TaskStatus<R>()
}
sealed class TaskResult {
object NoResult : TaskResult()
data class TaskBResult(val resultData: String) : TaskResult()
}
在這里,您有Task.A和Task.B,其中:
- 一個完成
Task.A只接受NoResult - 一個完成
Task.B只接受TaskBResult
但是,當我運行這個時:
fun main() {
val taskA = Task.A(
data = "data",
status = TaskStatus.InProgress
).copy(
status = TaskStatus.Completed(
result = NoResult
)
)
val taskB = Task.B(
data = "data",
status = TaskStatus.InProgress
).copy(
status = TaskStatus.Completed(
result = TaskBResult(
resultData = "resultData"
)
)
)
}
設定初始狀態時出現以下編譯錯誤Task.B:
status = TaskStatus.InProgress
Type mismatch.
Required: TaskStatus<TaskResult.TaskBResult>
Found: TaskStatus.InProgress
有誰知道如何更改資料模型以便我可以運行這個(或非常相似的)main功能?
uj5u.com熱心網友回復:
這可以通過很少的更改來作業:只需創建TaskStatus一個協變泛型類并創建InProgress一個TaskStatus<Nothing>. 當您擁有不代表任何狀態的“特殊情況”物件時,這是您可以使用的典型策略。進行此更改后,您的代碼應編譯:
sealed class Task<R : TaskResult> {
abstract val status: TaskStatus<R>
data class A(
val data: String,
override val status: TaskStatus<TaskResult.NoResult>,
) : Task<TaskResult.NoResult>()
data class B(
val data: String,
override val status: TaskStatus<TaskResult.TaskBResult>,
) : Task<TaskResult.TaskBResult>()
}
sealed class TaskStatus<out R : TaskResult> {
object InProgress : TaskStatus<Nothing>()
data class Completed<R : TaskResult>(val result: R) : TaskStatus<R>()
}
sealed class TaskResult {
object NoResult : TaskResult()
data class TaskBResult(val resultData: String) : TaskResult()
}
fun main() {
val taskA = Task.A(
data = "data",
status = TaskStatus.InProgress
).copy(
status = TaskStatus.Completed(
result = NoResult
)
)
val taskB = Task.B(
data = "data",
status = TaskStatus.InProgress
).copy(
status = TaskStatus.Completed(
result = TaskBResult(
resultData = "resultData"
)
)
)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494514.html
下一篇:TS為陣列的每個函式成員推斷引數
