You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 10:24:12