如何检查Kotlin的泛型?

我有课

class Generic<T : SuperType>() 

而这个代码是不正确的

 fun typeCheck(s: SuperType): Unit { when(s){ is T -> //do some thin } } 

但是s as T显示警告 – 不安全的转换,则会将其键入T s as T
如何检查是T型?

泛型类型在运行时并不在JVM上,所以在Kotlin中没有办法做到这一点。 警告是正确的,因为编译器不可能产生任何在转换完成时将失败的指令,所以转换是不被选中的,这意味着程序在某个时刻可能会或可能不会中断。

可能使用的相关功能是内联函数中的通用类型参数 。 虽然类不能具有特定的类型参数,但如果你详细说明一下你的用例,我可以试着帮你实现你所需要的东西。

如果你需要检查是否有泛型类型T你需要有一个Class<T>的实例来检查。 这是Java中的一种常见技术,在Kotlin中,我们可以使用内联工厂方法来获取类对象。

 class Generic<T : Any>(val klass: Class<T>) { companion object { inline operator fun <reified T : Any>invoke() = Generic(T::class.java) } fun checkType(t: Any) { when { klass.isAssignableFrom(t.javaClass) -> println("Correct type") else -> println("Wrong type") } } } fun main(vararg args: String) { Generic<String>().checkType("foo") Generic<String>().checkType(1) }