如何获取泛型变量的实例类型,解决T类型判断时的报错问题
泛型类型参数T的类型判断解决方案
问题原因
JVM平台泛型默认存在类型擦除,运行时不会保留泛型参数的实际类型,同时你直接将类型参数T作为表达式用is判断的写法本身不符合语法规范,因此会抛出Type parameter 'T' is not an expression错误。
方案1:使用Kotlin具体化类型参数(reified)
如果是Kotlin环境的泛型函数,添加inline+reified修饰符后即可直接判断T的类型:
inline fun <reified T> doSomethingByType() { if (T::class == String::class) { // 字符串类型对应逻辑 } else if (T::class == Int::class) { // 整型类型对应逻辑 } }
方案2:构造时传入Class对象(兼容Kotlin/Java)
如果是泛型类场景,或者是Java环境,可以在类初始化时主动传入泛型对应的Class实例,后续用该实例做类型判断:
Kotlin实现示例
class MyClass<T>(private val tClass: Class<T>) { fun doSomething() { if (tClass == String::class.java) { // 字符串类型对应逻辑 } else if (tClass == Int::class.java) { // 整型类型对应逻辑 } } } // 初始化示例 val stringHandler = MyClass(String::class.java)
Java实现示例
public class MyClass<T> { private Class<T> tClass; public MyClass(Class<T> tClass) { this.tClass = tClass; } public void doSomething() { if (tClass == String.class) { // 字符串类型对应逻辑 } else if (tClass == Integer.class) { // 整型类型对应逻辑 } } } // 初始化示例 MyClass<String> stringHandler = new MyClass<>(String.class);
方案3:通过泛型实例判断类型
如果代码逻辑中可以拿到T类型的实例对象,不需要额外处理泛型擦除,直接判断实例的类型即可:
fun <T> doSomething(instance: T) { if (instance is String) { // 字符串类型对应逻辑 } else if (instance is Int) { // 整型类型对应逻辑 } }
内容的提问来源于stack exchange,提问作者hermanjakobsen
相关产品推荐
相关产品推荐

