Kotlin动态设置变量类型实现通用API响应模型的方法
实现方案
你当前的实现没有用到Kotlin泛型能力,用Any作为通用字段类型会丢失具体类型信息,编译器无法识别data字段的实际类型,自然无法直接访问具体类的属性,正确实现如下:
第一步:定义泛型版API响应基类
用泛型参数T指代data字段的动态类型,替换原来的Any?声明:
class APIResponse<T>( var msg: String? = null, var code: String? = null, var data: T? = null )
第二步:实现泛型适配函数
分两种常用场景写适配逻辑:
场景1:传入具体data实例生成响应对象
普通泛型函数即可支持,类型会根据传入的实例自动推导:
fun <T> generateApiResponseAdapter(dataInstance: T?): APIResponse<T> { return APIResponse(data = dataInstance) }
使用示例:
// 先实例化业务模型 val transaction = Transactions( id = 1, amount = 99.9f, category = "餐饮", regarding = "周末聚餐" ) // 传入实例生成响应,泛型自动推导为Transactions类型 val resp = generateApiResponseAdapter(transaction) // 直接访问data的属性,不需要额外类型转换 println(resp.data?.amount) // 正常输出99.9
场景2:不传入实例,仅指定类型生成空响应(适合网络反序列化场景)
如果需要像你写的那样只指定类型、不提前传入data实例,用Kotlin的内联+实化泛型实现,绕开JVM泛型擦除限制:
inline fun <reified T> generateApiResponseAdapter(): APIResponse<T> { return APIResponse() }
使用示例:
// 指定泛型类型生成空响应对象 val resp = generateApiResponseAdapter<Transactions>() // 后续给data赋值 resp.data = Transactions(2, 39.9f, "交通", "地铁充值") // 同样可以直接访问属性,无需强转 println(resp.data?.category) // 输出"交通"
原实现的问题
Any?是Kotlin所有类型的根类型,用它声明字段会丢失具体类型信息,编译器无法做类型检查和属性提示- 你原来写的
generateApiResponseAdapter(Transactions)传入的是Transactions类的伴生对象实例,并不是类型声明,无法和data字段做类型绑定 - 这类字段类型可变的通用数据模型,核心实现方式就是泛型,不需要用
Any做妥协,编译期就能帮你避免类型转换错误
内容的提问来源于stack exchange,提问作者Nitin sharma
相关产品推荐
相关产品推荐

