实化泛型
怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline
关键字来修饰该函数。其次,在声明泛型的地方必须加上reified
关键字来表示该泛型要进行实化。示例代码如下:
inline fun <reified T> getGenericType(){
}
上述函数中的泛型T
就是一个被实化的泛型,因为它满足了内联函数和reified
关键字这两个前提条件。那么借助泛型实化,到底可以实现什么样的效果呢?从函数名就可以看出来了,这里我们准备实现一个获取泛型实际类型的功能,代码如下所示:
inline fun <reified T> getGenericType() = T::class.java
虽然只有一行代码,但是这里却实现了一个Java中完全不可能实现的功能:getGenericType()
函数直接返回了当前指定泛型的实际类型。T.class
这样的语法在Java中是不合法的,而在Kotlin中,借助泛型实化功能就可以使用T::class.java
这样的语法了。
现在我们可以使用如下代码对getGenericType()
函数进行测试:
val test1 = getGenericType<String>()
val test2 = getGenericType<Int>()
泛型实化的应用
在我们实现ActivityA-->ActivityB时,我们需要这样写:
val intent= Intent(applicationContext,ExampleActivity::class.java)
startActivity(intent)
这是很常见的一种写法,但是我们如果使用泛型实化来简化它呢?那么我们就可以这样写:
inline fun <reified T> myStartActivity(context: Context) {
val intent = Intent(context, T::class.java)
context.startActivity(intent)
}
那么我们调用:
myStartActivity<ExampleActivity>(applicationContext)
当然,一般我们跳转Activity是需要传参数的,那么我们可以进一步完善我们的方法:
inline fun <reified T> myStartActivity(context: Context, block: Intent.() -> Unit) {
val intent = Intent(context, T::class.java)
intent.block()
context.startActivity(intent)
}
调用:
myStartActivity<ExampleActivity>(applicationContext){
putExtra("param1","value")
putExtra("param2",2)
}