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 obs.map{ it.copy(hd = true) } 

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

其次, DownloadWallpaper它自己没有“高清”字段。 我可以使用这个时候如何修复这个优雅? 这个解决方案相当难看:

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

通过添加一些抽象方法到你的密封类,我可以访问复制方法,而无需显式types检查。 你自己看:

 sealed class DownloadWallpape { abstract val hd: Boolean abstract fun copy(hd: Boolean): DownloadWallpape } data class Progress(override val hd: Boolean = false, val a: Any) : DownloadWallpape() { override fun copy(hd: Boolean) = copy(hd = hd, a = a) } data class Success(override val hd: Boolean = false, val s: String) : DownloadWallpape() { override fun copy(hd: Boolean) = copy(hd = hd, s = s) } data class Error(override val hd: Boolean = false, val c: Int) : DownloadWallpape() { override fun copy(hd: Boolean) = copy(hd = hd, c = c) } fun main() { val dw: DownloadWallpape = Progress() val newDw = dw.copy(hd = false) val newDwSameHd = dw.copy(hd = dw.hd) }