gpt4 book ai didi

kotlin - 对密封类 child 列表进行排序的通用方法

转载 作者:行者123 更新时间:2023-12-02 12:44:40 25 4
gpt4 key购买 nike

我想将我的列表转换为从方法参数接收到的类类型。
基本上我想根据 ClassA 中存在的字段来排序我的列表。
如何做到这一点?

sealed class ParentClass
data class ClassA(fieldInClassType: Int) : ParentClass()
data class ClassB(fieldInClassType: Int) : ParentClass()
我有一个 ClassA 和 ClassB 的列表,我想创建一个通用方法来对它们进行排序。在我的旧代码中,我使用了 when()但它看起来很丑。
所以我试图用通用方法重构代码。这就是我现在所拥有的
private fun <T: ParentClass>foo(data: List<T>,  classType: Class<T>){
val list = data as classType
list.sortedBy{it.fieldInClassType}
}

最佳答案

如果您使用的是密封类,则可以使用 when为了确保您的代码涵盖所有潜在的子类。

sealed class ParentClass
data class ClassA(val fieldInClassType: Int) : ParentClass()
data class ClassB(val fieldInClassType: Int) : ParentClass()

fun foo(data: List<ParentClass>): List<ParentClass> {
return data.sortedBy {
when (it) {
is ClassA -> it.fieldInClassType
is ClassB -> it.fieldInClassType
}
}
}

fun main() {
val sorted = foo(listOf(ClassA(4), ClassB(1)))
sorted.forEach { println(it.javaClass) }
}
输出:

ClassB

ClassA


然而....
如果所有子类都具有该字段,请使用接口(interface):
interface MyInterface {
val fieldInClassType: Int
}

sealed class ParentClass : MyInterface
data class ClassA(override val fieldInClassType: Int) : ParentClass()
data class ClassB(override val fieldInClassType: Int) : ParentClass()

fun foo(data: List<ParentClass>): List<ParentClass> {
return data.sortedBy { it.fieldInClassType }
}

关于kotlin - 对密封类 child 列表进行排序的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63562242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com