重写ViewModelProvider.Factory方法报返回类型应为'T'错误如何解决
报错产生原因
这个报错是你重写的create方法签名和当前引入的ViewModelProvider.Factory接口定义不匹配导致的:
- 在AndroidX Lifecycle 2.5.0及以上版本中,
ViewModelProvider.Factory接口的create方法泛型上界已经从旧版的可空类型ViewModel?调整为非空类型ViewModel,你代码里写的T : ViewModel?和接口要求的非空返回类型不匹配,IDE就会提示「Change return type to 'T'」的错误。 - 你当前的实现直接将
NewsViewModel实例强转为T没有做类型校验,不符合Factory接口的设计契约:当调用方传入其他ViewModel类型的Class对象时,会直接触发类型转换崩溃。
修复方案
- 对齐接口方法签名,将泛型上界从
T : ViewModel?修改为T : ViewModel - 增加类型校验逻辑:判断传入的
modelClass是否和你要创建的NewsViewModel类型匹配,匹配才返回实例,不匹配则抛出参数异常 - 因为已经做了前置类型校验,强转逻辑是安全的,可以添加注解压制unchecked cast警告
修复后的完整代码如下:
class NewsViewModelProviderFactory( private val newsRepository: NewsRepository ) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(NewsViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return NewsViewModel(newsRepository) as T } throw IllegalArgumentException("无法识别的ViewModel类型: ${modelClass.name}") } }
补充:如果你的项目已经接入了Lifecycle 2.6及以上版本,更推荐使用
viewModelFactoryDSL实现ViewModel创建逻辑,不需要手写Factory类的类型校验和强转代码,写法更简洁安全。
内容的提问来源于stack exchange,提问作者Ibti Ssem
相关产品推荐
相关产品推荐

