Java的泛型擦除机制
Kotlin内联函数inline
- 内联函数的代码会在编译的时候自动被替换到调用它的地方
- 这样的话,就不存在什么泛型擦除的问题了
- 因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明
通过内联函数,Kotlin就可以把泛型函数进行实化
- 首先该函数必须是内联函数,也就是需要调用inline关键字来修饰该函数
- 其次,在声明泛型的地方必须加上reified关键字来表示该泛型要进行实化
package com.example.sunnyweather.logic.network
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
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关键字这两个前提条件
- 那么,我们为什么要这么做呢?
- 实际上我们是为了得到一个泛型实际类型的功能,即真正能用的类
泛型实化的应用
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)
}