问题描述
您好,我正在尝试使用 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 反射慢大,并且每个项目都使用反射。