gpt4 book ai didi

kotlin - 检查传递的参数是否是类的类型

转载 作者:行者123 更新时间:2023-12-02 13:33:57 27 4
gpt4 key购买 nike

我想调用以下函数:

fun <T> isCurrentActivity( t: Class<T>): Boolean {
return (currentActivity != null) && (currentActivity is t)
}

if (isCurrentActivity(MainActivity::class.java)) {

}

但 t 是一个 Unresolved reference 。我该如何解决?我不能使用内联具体化函数,因为该函数需要公开可用。

最佳答案

问题是 JVM 删除了泛型类型,因此参数 T 的类型在运行时不可访问。

这就是为什么在 Java 中一个流行的模式是传递 Class<T> 的实例。作为参数。 Kotlin 中不需要,因为在 Kotlin 中我们可以定义 reified type 并且该类型可以在运行时访问。

例子:

inline fun <reified T> isCurrentActivity(): Boolean {
return (currentActivity != null) && (currentActivity is T)
}

fun example() {
if (isCurrentActivity<MainActivity>()) {
// it is!
}
}

标记要求 Treified将函数标记为 inline .在文档中查看更多信息: https://kotlinlang.org/docs/reference/inline-functions.html#reified-type-parameters

上面的一个例子是“kotlin 的方式来做到这一点”。如果您想继续使用“类似 java 的代码”,您所犯的错误是尝试检查 currentActivity是变量的一个实例——这是不可能的。正确的方法是:
fun <T> isCurrentActivity(t: Class<T>): Boolean {
return (currentActivity != null) && currentActivity.javaClass == t
}

请参阅@gidds 关于上述检查的评论。

但是,我仍然建议使用 reified类型参数,因为这是检查类型的一种非常好的方法。

关于kotlin - 检查传递的参数是否是类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59660007/

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