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)


参考文献:




相关文章
|
3月前
|
安全 Java Kotlin
Kotlin泛型:灵活的类型参数化
Kotlin泛型:灵活的类型参数化
|
3月前
|
安全 Java 编译器
Android面试题之Java 泛型和Kotlin泛型
**Java泛型是JDK5引入的特性,用于编译时类型检查和安全。泛型擦除会在运行时移除类型参数,用Object或边界类型替换。这导致几个限制:不能直接创建泛型实例,不能使用instanceof,泛型数组与协变冲突,以及在静态上下文中的限制。通配符如<?>用于增强灵活性,<? extends T>只读,<? super T>只写。面试题涉及泛型原理和擦除机制。
33 3
Android面试题之Java 泛型和Kotlin泛型
|
Kotlin
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
85 0
|
12月前
|
安全 Java 编译器
Kotlin 泛型 VS Java 泛型
Kotlin 泛型 VS Java 泛型
63 0
|
存储 JSON 安全
From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了
上期主要分享了 From Java To Kotlin 1 :空安全、扩展、函数、Lambda。 这是 From Java to Kotlin 第二期。 带来 表达式思维、子类型化、类型系统、泛型。
202 0
From Java To Kotlin 2:Kotlin 类型系统与泛型终于懂了
|
安全 Java 编译器
Kotlin | 理解泛型使用
泛型,指的是具体的类型泛化,多用在集合中(如`List`、`Map`),编码时使用符号代替,在使用时再确定具体类型。
147 0
|
安全 Java C#
Kotlin 之泛型详解
Kotlin 之泛型详解
|
存储 安全 Java
「Java 路线」| 关于泛型能问的都在这里了(含Kotlin)
「Java 路线」| 关于泛型能问的都在这里了(含Kotlin)
123 0
「Java 路线」| 关于泛型能问的都在这里了(含Kotlin)
|
安全 Java 编译器
重学Kotlin之泛型的逆变和协变
泛型的逆变和协变
256 0
|
存储 Java 编译器
Kotlin | 浅谈 Reified 与泛型 的三两事
背景 在业务中,或者要写某个技术组件时,我们无可避免会经常使用到 泛型 ,从而让代码更具复用性与健壮性。 但相应的,由于Java泛型存在 类型擦除 的实现机制,所以某些情况下就会显得力不从心。而在 Kotlin 中,由于最终也会被编译为java字节码,所以无可避免也存在这上述问题🙂。
205 0