创建通用扩展以制作包含数据的列表的深层副本 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反射是慢和大,每个项目都使用反射。
您好,我正在尝试创建一个通用函数,使用数据 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反射是慢和大,每个项目都使用反射。