Kotlin刨根问底(三):你真的懂泛型,会用吗?(下)

简介: 本文灵感来源:群友提出泛型相关的问题,感觉很多人对泛型并不是很了解~ Kotlin中的泛型和Java中的泛型其实大同小异,只是语法稍微有些不同。 大部分内容摘取自:《Kotlin实用指南》

0x7、Kotlin中的型变


和Java泛型一样,Kotlin中的泛型也是「不变的」,没有「通配符类型」,但有两个其他的东西:「声明处型变」(declaration-site variance)  与 「类型投影」(type projections)


① 声明处型变


其实就是用「out」和「in」关键字来替换


  • out协变,等同于Java中的<? extends>,能读不能写,代码示例如下:



  • in逆变,等同于Java中的<? super>,能写不能读,代码示例如下:



② 类型投影


其实就是对应Java中的*通配符:


  • Java中<?>等同于<* extends Object>


  • Kotlin中<*>等同于out Any


0x7、Kotlin获取泛型类型


在Kotlin中可以通过下述四种方法获取泛型的类型(前两种Java也适用):


① 匿名内部类


原理:匿名内部类的声明在编译时进行,实例化在运行时进行代码示例如下



② 反射


获取运行时泛型参数类型,子类可获得父类泛型的具体类型。代码示例如下



③ 实例化类型参数代替类引用


定义一个扩展函数用于启动Activity,代码示例如下:


fun <T: Activity> FragmentActivity.startActivity(context: Context, clazz: Class<T>) {
    startActivity(Intent(context, clazz))
}
// 调用
startActivity(context, MainActivity::class.java)


④ 内联函数


Kotlin中使用「inline」关键字定义一个内联函数,配合「reified」具体化(类型不擦除),得到使用泛型类型的Class。修改后的代码示例如下:


inline fun <reified T : Activity> Activity.startActivity(context: Context) {
    startActivity(Intent(context, T::class.java))
}
// 调用
startActivity<MainActivity>(context)


参考文献:




相关文章
|
6月前
|
安全 Java Kotlin
Kotlin泛型:灵活的类型参数化
Kotlin泛型:灵活的类型参数化
|
4月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
44 2
|
2月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
31 3
|
2月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
|
2月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
24 0
|
2月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
本教程详细讲解了Kotlin中的泛型概念,包括协变、逆变、类型投影及泛型函数等内容。适合已有Java泛型基础的学习者,深入理解Kotlin泛型机制。快速学习者可参考“简洁”系列教程。
29 0
|
6月前
|
安全 Java 编译器
Android面试题之Java 泛型和Kotlin泛型
**Java泛型是JDK5引入的特性,用于编译时类型检查和安全。泛型擦除会在运行时移除类型参数,用Object或边界类型替换。这导致几个限制:不能直接创建泛型实例,不能使用instanceof,泛型数组与协变冲突,以及在静态上下文中的限制。通配符如<?>用于增强灵活性,<? extends T>只读,<? super T>只写。面试题涉及泛型原理和擦除机制。
41 3
Android面试题之Java 泛型和Kotlin泛型
|
Kotlin
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
101 0
|
安全 Java 编译器
Kotlin 泛型 VS Java 泛型
Kotlin 泛型 VS Java 泛型
86 0
|
存储 JSON 安全
From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了
上期主要分享了 From Java To Kotlin 1 :空安全、扩展、函数、Lambda。 这是 From Java to Kotlin 第二期。 带来 表达式思维、子类型化、类型系统、泛型。
230 0
From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了