gpt4 book ai didi

generics - 如果你只有一个 KClass 对象,用 reified 类型参数调用一个 fun 吗?

转载 作者:行者123 更新时间:2023-12-02 12:03:21 24 4
gpt4 key购买 nike

只能将具体化的类型参数与内联函数一起使用。所以如果我想要一个类的这样的参数,我需要一个这样的技巧:

class Foo<T : Any>(private val clazz: KClass<T>) {
companion object {
inline fun <reified T: Any> create() = Foo(T::class)
}
}

然后我可以创建 Foo 的实例像这样:
val foo = Foo.create<Bar>()

Foo我有权限 clazz但我的问题是 然后我可以使用 clazz当我需要调用需要具体化类型参数的方法时` ?

例如。内 Foo我想添加一个这样的方法:
fun print(list: List<Alpha>) {
list.filterIsInstance<T>().forEach { print(it) }
}

但据我所知,无法从 clazz 获得我可以在这里用作类型参数的东西。

是的,我知道有一种形式的 filterIsInstance这需要一个 Class所以我可以这样做:
list.filterIsInstance(clazz.java).forEach { print(it) }

然而,许多库都包含不提供两种形式(显式类参数和具体化类型参数)的方法。

例如。 jackson Kotlin Extensions.kt .实际上这不是一个很好的例子,因为非具体化的等价物都是单行的,但情况并非总是如此——然后你最终将具体化类型参数方法的实现解包到你的代码中。

最佳答案

不,因为这些函数是 inline , 它们在编译时内联
并且 Class 或 KClass 在运行时使用反射

有一些技巧可以做.. 就像同伴类(class)一样,但这不需要KClass<T>根本......任何其他提供 T 通用参数的东西对 reified 也同样有效输入信息

PS:反射也不能可靠地帮助你,因为内联函数在运行时并不真正存在,正如它们的修饰符 inline 所解释的那样

关于generics - 如果你只有一个 KClass 对象,用 reified 类型参数调用一个 fun 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399737/

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