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

标签 generics kotlin

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

相关文章:

android - Unresolved reference getResources() Kotlin

android - 在项目中找不到任务 'prepareKotlinBuildScriptModel'

kotlin - 在 Kotlin 中对可空整数使用 "greater than"、 "less than"比较的正确方法是什么?

java - 您如何重写在 Java 8 中使用泛型和函数并仅使用面向对象的混合 oop 和函数式编程的代码?

java - 在下面的示例中, "List<? extends T>"是必要的吗?或者 "List<T>"会做同样的事情吗?

c# - 为什么这种隐式转换不起作用?

java - 什么时候绝对需要泛型数组——一个案例

java - Java 中的泛型声明差异

javascript - 如何使用 Kotlin 匿名类作为原生 JavaScript 函数的参数?

android - E/FirebaseInstanceId : Token retrieval failed: AUTHENTICATION_FAILED - what changed?