创建通用扩展以使用数据类制作列表的深层副本

问题描述

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

我正在使用我在其他帖子中找到的方法,该方法返回被深度复制的对象列表:

listDataClass.map{ it.copy() }

但我似乎不知道如何将它作为数据类的通用函数,所以我真的很想知道你是如何制作这样的。

解决方法

通过使用 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 反射,并且每个项目都使用反射。