创建通用扩展以制作包含数据的列表的深层副本 Class

Create generic extension to make a deep copy of a List with Data Class

您好,我正在尝试创建一个通用函数,使用数据 class 提供给我们的 copy() 方法来制作列表的深层副本。

我正在使用我在其他 post 上找到的方法,其中 returns 正在深度复制的对象列表:

listDataClass.map{ it.copy() }

但我似乎不知道如何将它作为数据的通用函数 class 所以我真的很想知道你是怎么做到的。

通过使用 kotlin 反射魔法,你可以这样做:

class NotADataClassException(clazz: KClass<out Any>): Exception("$clazz is not a data class")

fun List<T>.deepCopy(): List<T> {
    return map { item ->
        if (!item::class.isData) {
            throw NotADataClassException(item::class)
        } else {
            item::class.members.first { it.name == "copy" }.callBy(emptyMap()) as T
        } 
    }
}

但是,由于以下原因,这很糟糕:

  • 这不会在编译时将元素限制为数据 类(这正是我们想要对泛型做的!)相反,它会抛出异常。

  • Kotlin反射是,每个项目都使用反射。