gpt4 book ai didi

generics - make函数检测类型模型数据时的“Cannot use T as a reified type parameter”

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

我编写了一些代码,以使用“DefineTypeGeneric”类检测类型模型数据。

主类

fun main() {
val list = ArrayList<Any>()
list.add("Kelvin")
list.add(23)
DefineTypeGeneric<String>().checkType(list[0]) // work
DefineTypeGeneric<String>().checkType(list[1]) // work
}

DefineTypeGeneric类
class DefineTypeGeneric<T>(private val classGeneric: Class<T>) {
companion object {
inline operator fun <reified T>invoke() = DefineTypeGeneric(T::class.java)
}
fun checkType(t: Any) {
when {
classGeneric.isAssignableFrom(t.javaClass) -> println("Correct Type")
else -> println("Wrong Type")
}
}
}

它适用于这种情况。

现在,我想像这种情况一样检测数据模型类型,但是使用类似这样的函数。

函数通用
fun <T>functionGeneric(t: Any) {
DefineTypeGeneric<T>().checkType(t)
}

我称该功能。
functionGeneric<String>(list[0])

但是,我收到错误消息“ 无法使用'T'作为化类型参数。使用类代替“。

Error Cannot use 'T' as reified type parameter. Use a class instead

如何解决这种情况?

最佳答案

为此,还需要使函数内联+修改type参数:

inline fun <reified T> functionGeneric(t: Any) {
DefineTypeGeneric<T>().checkType(t)
}

这样做的原因是,您的 DefineTypeGeneric<T>()实际上是内联的,并通过使用其在调用站点上拥有的信息(必须使用 T)来对类型参数 T::class.java进行修改。

如果您也没有使新的 functionGeneric内联,则在 T的调用站点(位于 DefineTypeGeneric<T>()的内部)中没有关于 functionGeneric的信息。

附带说明一下,如果您不需要 DefineTypeGeneric类中的任何其他功能,则可以使用单个顶级内联函数来完成所有这些操作:
inline fun <reified T> checkType(t: Any) {
when {
T::class.java.isAssignableFrom(t::class.java) -> println("Correct")
else -> println("Wrong")
}
}

或者,如果逻辑比较复杂,则可以使用一个内联函数和一个标准函数:
inline fun <reified T> checkType(t: Any) = checkType(T::class.java, t)

fun <T> checkType(target: Class<T>, t: Any) {
when {
target.isAssignableFrom(t::class.java) -> println("Correct")
else -> println("Wrong")
}
}

关于generics - make函数检测类型模型数据时的“Cannot use T as a reified type parameter”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60539753/

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