Kotlin中的密封数据类 [英] Sealed data class in Kotlin

查看:92
本文介绍了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()
}

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

And I am trying to do the following.

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

但是我不能,有两个原因,因为DownloadWallpaper不是数据类.没有.copy()方法.我怎么能告诉Kotlin,这个印章类中的所有类实际上都是data classes?

But I cant, for two reasons since DownloadWallpaper isn't a data class. There's not .copy() method. How can I tell Kotlin that all classes in this seal class are in fact data classes?

第二,DownloadWallpaper它本身没有"hd"字段.我可以在何时可以优雅地修复此问题时使用它? 此解决方案非常难看:

Secondly, DownloadWallpaper it self doesn't have an 'hd' field. I could cast this using when How can fix this elegantly? This solution is quite ugly:

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)
 }

推荐答案

通过在密封的类中添加一些抽象方法,我可以在没有显式类型检查的情况下访问复制方法.亲自看看:

By adding a few abstract methods to your sealed class I was able to access copy methods without explicit type check. See for yourself:

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中的密封数据类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆