如何从封装在泛型中的Retrofit调用结果提取键?
解决方案
步骤1:优化泛型类型(推荐,避免不安全类型转换)
先修改Repository的返回类型,明确指定泛型为HashMap<String, Double>,同时ViewModel的LiveData也同步指定泛型,从根源避免后续类型转换风险:
修改后的Repository代码
suspend fun getData(): RetrofitResult<HashMap<String, Double>>{ return try { val response = myApi.makeCall() // 为空时返回空HashMap,避免后续空指针异常 RetrofitResult.Success(myData= response.body()?.myHashMap ?: hashMapOf()) } catch (exception: IOException) { // 异常处理优先用exception本身,防止cause为空 RetrofitResult.Error(error = exception.cause ?: exception) } }
修改后的ViewModel代码
private val _dataStatus = MutableLiveData<RetrofitResult<HashMap<String, Double>>>() val latestRates: LiveData<RetrofitResult<HashMap<String, Double>>> get() = _dataStatus fun myData() { viewModelScope.launch { try { val apiResponse = myRepository.getData() _dataStatus.value = apiResponse } catch (exception: IOException) { // 此处可添加错误处理逻辑,比如记录日志 } } }
步骤2:提取HashMap的键到List
在观察latestRates的页面(如Activity或Fragment)中,通过when分支判断结果类型,当为Success时直接提取键列表:
viewModel.latestRates.observe(this) { result -> when(result) { is RetrofitResult.Success -> { // 将HashMap的键转换为目标List<String> val keyList: List<String> = result.myData.keys.toList() // 此时keyList就是你需要的格式,可直接执行数据库存储逻辑 } is RetrofitResult.Error -> { // 处理错误场景,比如给用户提示网络异常 } } }
兼容方案(不推荐,仅用于无法修改泛型的场景)
如果不能调整原有泛型定义,可通过安全类型转换处理,但存在转换失败风险:
viewModel.latestRates.observe(this) { result -> when(result) { is RetrofitResult.Success -> { val hashMap = result.myData as? HashMap<String, Double> hashMap?.let { val keyList: List<String> = it.keys.toList() // 执行数据库存储逻辑 } } is RetrofitResult.Error -> { // 错误处理 } } }
内容的提问来源于stack exchange,提问作者katowicenocom
相关产品推荐
相关产品推荐

