如何为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
相关产品推荐
相关产品推荐

