Kotlin学习笔记之泛型的高级特性
1.1 对泛型进行实化
那么具体该怎么写才能将泛型实化呢?首先,该函数必须是内联函数才行,也就是要用inline关键字来修饰该函数。其次,在声明泛型的地方必须加上reified关键字来表示该泛型要进行实化。
内联函数中的代码会在编译的时候自动被替换到调用它的地方,这样的话也就不存在什么泛型擦除的问题了,因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明.
inline fun <reified T> getGenericType() = T::class.java
fun main() {
println(getGenericType<String>())
println(getGenericType<Int>())
}
// 运行结果
class java.lang.String
class java.lang.Integer
1.2 泛型实化的应用
泛型实化功能允许我们在泛型函数当中获得泛型的实际类型,这也就使得类似于a is T、
T::class.java这样的语法成为了可能。而灵活运用这一特性将可以实现一些不可思议的语法结构.
简化启动Activity
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)
}
1.3 泛型的协变
一个泛型类或者泛型接口中的方法,它的参数列表是接收数据的地方,因此可以称它为in位置,而它的返回值是输出数据的地方,因此可以称它为out位置.
1.4 泛型的逆变
协变和逆变,确实有一定的难度,以后再详细了解