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

如何为Kotlin密封类的泛型指定具体类型,正确识别Weather类而非Any?

解决方案

方案1:给密封类增加顶层泛型声明(推荐)

如果当前页面的接口请求仅返回Weather类型数据,直接给密封类顶层加上泛型约束,从根源上避免类型识别问题:

// 修改后的密封类定义
sealed class ResponseResult<out T> {
    class Success<out T>(val data: T, val city: String) : ResponseResult<T>()
}

同时将ViewModel中_screenState的类型声明为MutableLiveData<ResponseResult<Weather>>,Fragment中观察时无需额外类型判断即可识别data类型:

viewModel.screenState.observe(viewLifecycleOwner) {
    when (it) {
        is ResponseResult.Success<Weather> -> {
            setSuccessResult()
            // it.data 自动识别为Weather类型,可直接调用对应属性
            it.data.temperature
        }
    }
}

方案2:适配多返回类型场景的类型转换

如果你的ResponseResult需要支持多种不同的data返回类型,无法固定顶层泛型,直接在逻辑中增加类型判断触发Kotlin智能转换即可:

viewModel.screenState.observe(viewLifecycleOwner) {
    when (it) {
        is ResponseResult.Success<*> -> {
            setSuccessResult()
            // 方式1:is判断后自动智能转换
            if (it.data is Weather) {
                it.data.temperature
            }
            // 方式2:安全强转后执行逻辑
            (it.data as? Weather)?.let { weather ->
                weather.temperature
            }
        }
    }
}

如果你确定当前场景下Success的data一定是Weather类型,也可以添加忽略注解直接做泛型匹配:

viewModel.screenState.observe(viewLifecycleOwner) {
    when (it) {
        @Suppress("UNCHECKED_CAST")
        is ResponseResult.Success<Weather> -> {
            setSuccessResult()
            it.data.temperature
        }
    }
}

内容的提问来源于stack exchange,提问作者Dante313

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:36:03