我编写了一些代码,以使用“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/