Kotlin Type mismatch错误:推断为T!但期望T & Any如何解决
报错原因
T & Any是Kotlin的泛型非空标记,代表方法要求返回非空的T类型实例:你重写的ViewModelProvider.Factory#create方法从AndroidX KTX 2.6.0版本开始,就明确约束返回值为非空ViewModel,不允许返回null。- 代码中泛型声明为
<T : ViewModel?>,将T的上界定义为可空ViewModel类型,同时反射调用newInstance()返回的是T!平台类型——Java反射API的返回值在Kotlin中会被默认判定为空值未知的平台类型,编译器无法自动确认它一定非空,和方法要求的非空返回类型不匹配,就会触发该编译错误。 - 如果catch分支中直接return null,也会触发同类型错误,因为返回值明确要求非空。
修复方案
- 将泛型上界从可空的
ViewModel?修改为非空的ViewModel,从泛型约束层面明确T为不可空类型。 - 对反射newInstance返回的实例添加非空断言
!!,明确告知编译器该实例非空(正常反射实例化ViewModel的逻辑下不会返回null)。 - 异常分支不要返回null,直接抛出包装后的运行时异常即可,符合ViewModel初始化失败直接抛出异常的常规处理逻辑。
- 重写方法时不需要手动声明返回值为
T & Any,泛型改为非空上界后,返回值直接写T即可,编译器会自动匹配父类的非空返回约束。
修复后可正常编译的参考代码:
override fun <T : ViewModel> create(modelClass: Class<T>): T { return try { modelClass.getConstructor(DataRepository::class.java).newInstance(mRepository)!! } catch (e: Exception) { // 统一捕获反射过程中可能抛出的实例化异常、无匹配构造方法异常、访问权限异常等 throw RuntimeException("Create ViewModel ${modelClass.simpleName} failed", e) } }
内容的提问来源于stack exchange,提问作者U wan
相关产品推荐
相关产品推荐

