我有以下密封类
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/