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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:36:03