如何检查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) }