Kotlin真泛型原理,重载类的构造方法实现类的真泛型

Kotlin泛型

  • 可以用where来限定泛型的类型
class GenericTest {

    @Test
    fun test() {
        MyTest<A>().add(A())
    }

}

class A : CallBack, Runnable {
    override fun callBack() {
        println("callBack")
    }

    override fun run() {
        println("run")
    }

}

class MyTest<T> where T : CallBack, T : Runnable {
    fun add(t: T) {
        t.run()
        t.callBack()
    }
}

interface CallBack {
    fun callBack()
}

真泛型的原理

  • 泛型方法编译了 N 个不同类型的方法,通过调用点知道了传入的类型,然后通过内联函数将代码平铺到调用点,泛型方法中的代码就知道了泛型的类型

真泛型应用(对Gson改造,实现类的真泛型)

  • 结合扩展函数和内联函数对Gson进行一次封装
    这样就不需要使用TypeToken的匿名类来获取T的实际类型了
inline fun <reified T> Gson.fromJson(json: String): T {
    return fromJson(json, T::class.java)
}
  • reified只能修饰函数,不能修饰类,可以重载类的构造方法,使其具有真泛型的属性
class View<T>(private val clazz: Class<T>) {
    val presenter: T by lazy { clazz.newInstance() }

	//伴生对象会在类放入类加载器中时执行。在类构造方法执行前。
    companion object {
        //重载构造函数
        inline operator fun <reified T> invoke() = View(T::class.java)
    }
}

class Presenter

fun test2() {
    val p = View<Presenter>().presenter
}

参考文献

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值