Kotlin泛型实化

370 阅读1分钟

Java的泛型擦除机制

Kotlin内联函数inline

  • 内联函数的代码会在编译的时候自动被替换到调用它的地方
  • 这样的话,就不存在什么泛型擦除的问题了
  • 因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明

通过内联函数,Kotlin就可以把泛型函数进行实化

  • 首先该函数必须是内联函数,也就是需要调用inline关键字来修饰该函数
  • 其次,在声明泛型的地方必须加上reified关键字来表示该泛型要进行实化
package com.example.sunnyweather.logic.network

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

/**
 * Retrofit构建器
 * inline内联函数
 * reified实化
 */
object ServiceCreator {

    private const val BASE_URL = "https://api.caiyunapp.com/"

    private val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

    fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)

    inline fun <reified T> create(): T = create(T::class.java)
}
  • 上述代码中的最后一行,泛型T就是被实化的泛型 因为它满足了内联函数和reified关键字这两个前提条件
  • 那么,我们为什么要这么做呢?
  • 实际上我们是为了得到一个泛型实际类型的功能,即真正能用的类

泛型实化的应用

  • 启动Activity
/**
 * 使用inline关键字 和 reified关键字 简化startActivity的写法
 */
inline fun <reified T> startActivity(context: Context, block: Intent.() -> Unit) {
    val intent = Intent(context, T::class.java)
    intent.block()
    context.startActivity(intent)
}
  • 那么启动代码就可以优化了
startActivity<TestActivity>(context) {
	putExtra("param1", "data)
    putExtra("param2, 123)
}