Kotlin 泛型使用的一些思考,如只使用类泛型,持续添加思考
编程中泛型使用的场景还是挺多的,最近遇到一个需求,只是使用泛型但是不想使用泛型参数,就想了想如何实现
前提引用依赖GSON: implementation ‘com.google.code.gson:gson:2.8.5’
- 先谈一下经典的泛型使用场景
android客户端和后端通过json通信,一般格式为
{code:1,msg:"success",data:{name:"long",.....}}
,其中code,msg为通用字段,data的数据为可变的数据类型,json解析此类有共通的数据时便可使用泛型进行抽离.- 定义一个泛型基类:ResponseResult
data class ResponseResult<T>(var code:Int, var msg:String, var data:T)
- 定义一个具体的返回数据类:User
data class User(var name:String,var msg:String)
- 使用方式举例:
fun main(args: Array<String>) { val json="{code:1,msg:\"success\",data:{name:\"long\"}}" val userType = object : TypeToken<ResponseResult<User>>() {}.type val ss= Gson().fromJson<ResponseResult<User>>(json,userType) println(ss.toString()) println(Gson().toJson(Test<ResponseResult<User>>().result)) }
- 输出结果:
ResponseResult(code=1, msg=success, data=User(name=long, msg=null))
- 输出结果:
- 思考:
主要使用GSON提供的 TypeToken 对象进行获取泛型基类的类型,在使用 Gson().fromJson() 进行转化
- 定义一个泛型基类:ResponseResult
- 再说说我的使场景:
kotlin中定义一个val不可变属性result,重写支持字段的取值方式,自定义访问器即重写get()方法,但是这个属性是泛型的类型,依赖于类传入参数,但是不想使用泛型参数,感觉太麻烦,就思考着如何实现.
- 定义测试类Test:
class Test<T>{ var json="{code:1,msg:\"success\",data:{name:\"long\"}}" val result:T get() { val userType = object : TypeToken<T>() {}.type return Gson().fromJson<T>(json,userType) } }
- 测试
println(Gson().toJson(Test<ResponseResult<User>>().result))
- 输出结果
{"code":1.0,"msg":"success","data":{"name":"long"}}
- 思考
通用使用gson的TypeToken获取到泛型的类型,进行转化,从而实现转化
- 定义测试类Test: