Kotlin 泛型使用的一些思考,如只使用类泛型

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() 进行转化

  • 再说说我的使场景:

    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获取到泛型的类型,进行转化,从而实现转化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林深人不知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值