Kotlin 1.5将类型推断警告升级为错误,如何无需降级正常编译?
问题根本原因
Kotlin 1.5 版本将原1.4版本中的TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING类型推断警告直接升级为编译错误,你现有代码中仅对警告做了抑制,对升级后的错误不生效。同时触发错误的核心原因是providerMap的key类型是Class<out AbsViewModel>,你传入的modelClass是泛型Class<T>,编译器无法完成类型匹配的自动推断。
两种解决方案
方案1:补充抑制错误的注解
直接在@Suppress注解中添加Kotlin 1.5对应错误的抑制标识即可,修改后的代码如下:
class ViewModelFactory @Inject constructor(private val providerMap: MutableMap<Class<out AbsViewModel>, Provider<AbsViewModel>>) : ViewModelProvider.Factory { // 新增TYPE_INFERENCE_ONLY_INPUT_TYPES_ERROR抑制1.5版本升级后的编译错误 @Suppress("TYPE_INFERENCE_ONLY_INPUT_TYPES_WARNING", "TYPE_INFERENCE_ONLY_INPUT_TYPES_ERROR", "UNCHECKED_CAST") override fun <T : ViewModel> create(modelClass: Class<T>): T { (providerMap[modelClass]?.get() as? T)?.let { return it } throw Exception("Could not find view model for ${modelClass.canonicalName}") } }
方案2:显式指定类型,消除类型推断问题(更推荐)
不需要依赖抑制注解,直接在取map值的时候显式把modelClass转换为map对应的key类型,让编译器不需要做类型推断,从根源解决错误:
class ViewModelFactory @Inject constructor(private val providerMap: MutableMap<Class<out AbsViewModel>, Provider<AbsViewModel>>) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun <T : ViewModel> create(modelClass: Class<T>): T { // 显式转换modelClass为map匹配的key类型,消除类型推断逻辑 (providerMap[modelClass as Class<out AbsViewModel>]?.get() as? T)?.let { return it } throw Exception("Could not find view model for ${modelClass.canonicalName}") } }
以上两种方案都可以在Kotlin 1.5+环境下正常编译,不需要降级Kotlin版本。
内容的提问来源于stack exchange,提问作者Pitos
相关产品推荐
相关产品推荐

