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
}

参考文献

猜你喜欢

转载自blog.csdn.net/yu540135101/article/details/113448329