kotlin - Kotlin 中的密封数据类

标签 kotlin

我有以下密封类

sealed class DownloadWallpaper : Result() {
    data class Progress(val hd: Boolean = false, ...) : DownloadWallpaper() 
    data class Success(val hd: Boolean = false, ...) : DownloadWallpaper()
    data class Error(val hd: Boolean = false, ...) : DownloadWallpaper()
}

我正在尝试执行以下操作。

//obs is of type Observable<Detail.Result.DownloadWallpaper> 
obs.map{ it.copy(hd = true) }

但我不能,有两个原因,因为 DownloadWallpaper 不是数据类。没有 .copy() 方法。如何告诉 Kotlin 这个密封类中的所有类实际上都是数据类

其次,DownloadWallpaper 它本身没有“hd”字段。我可以使用 when 如何优雅地解决这个问题? 这个解决方案很丑:

when (it) {
           is Detail.Result.DownloadWallpaper.Success -> it.copy(hd = true)
           is Detail.Result.DownloadWallpaper.Progress -> it.copy(hd = true)
           is Detail.Result.DownloadWallpaper.Error -> it.copy(hd = true)
 }

最佳答案

通过向您的密封类添加一些抽象方法,我能够访问复制方法而无需显式类型检查。自己看:

sealed class DownloadWallpaper {
    abstract val hd: Boolean
    abstract fun copy(hd: Boolean): DownloadWallpaper
}

data class Progress(override val hd: Boolean = false, val a: Any) : DownloadWallpaper() {
    override fun copy(hd: Boolean) = copy(hd = hd, a = a)
}
data class Success(override val hd: Boolean = false, val s: String) : DownloadWallpaper() {
    override fun copy(hd: Boolean) = copy(hd = hd, s = s)
}
data class Error(override val hd: Boolean = false, val c: Int) : DownloadWallpaper() {
    override fun copy(hd: Boolean) = copy(hd = hd, c = c)
}

fun main() {
    val dw: DownloadWallpaper = Progress()
    val newDw = dw.copy(hd = false)
    val newDwSameHd = dw.copy(hd = dw.hd)
}

关于kotlin - Kotlin 中的密封数据类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47611882/

相关文章:

android - 尝试在 Canary 5 上迁移

generics - Kotlin - 相同的类,不同的内部类

java - 如何在android中为主ConstraintView设置边距?

kotlin - 如何用http4k在中间建模一个路径参数

android - RecyclerView 未绑定(bind)数据 notifyDataSetChanged 在过滤数据时不起作用

kotlin - 有关Kotlin的一些基本问题

android - 将 flutter Painter 转换为 compose

android - 是否可以在没有额外变量的情况下增加 mutablelivedata?

android - 根据Appbar的偏移量或高度调整 View 大小

android - 使用导航组件从一个 Activity 导航到另一个 Activity