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

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

0x5、Java有界泛型类型


如果不对泛型类型做限制,泛型类型可实例化为任意类型的话,可能会产生某些安全隐患。为了限制允许实例化的泛型类型,可在泛型类型后追加 extends 父类型,代码示例如下:



有界泛型类型在一定程度上限制了泛型类型,提高了程序的安全性;因为定义了边界,所以可以调用父类或父接口的方法


0x6、Java通配符


Java泛型本身「不变」的,不支持「协变」和「逆变」,是通过通配符(?)来实现的


① <T>与<?>的区别


<T>泛型标识符」用于泛型「定义时」可理解为「形参」;


<?>通配符」用于泛型「实例化时」可理解为「实参」。


代码示例如下



② 各种通配符


  • 上边界通配符<? extends 父类型>


实例化时可确定为「父类型的未知类型」故「只能读不能写」,从而使得类型是「协变的」。


代码示例如下



  • 下边界通配符:<? super 子类型>


实例化时可确定为「子类型的未知类型」故「只能写不能读」从而使得类型是「逆变的」。


(不能读指的是不能按照泛型类型读取)<代码示例如下:



上边界通配符只能读不能写,改为下边界通配符



  • 无限定通配符:<?>


等同于上边界通配符<? extends Object>,「类型完全未知」故「只能读不能写」从而使得类型是「不变的」。


Tips:看完这里,估计有部分读者还是有点懵逼,这里总结下:


  • 不变 → 子类和父类没关系,正常存取,不用通配符就好,Java集合本身就是不变的;


  • 协变 → A是B的子类型,泛型<A>也是泛型<B>的子类型,只想取,用extends。


  • 逆变 → A是B的子类型,泛型<B>也是泛型<A>的子类型,只想存,用super。


  • PECS法则(Producer Extends,Consumer Super) 参数化类型是一个生产者,则使用:<? extends T> 如果它是一个消费者,则使用<? super T>
相关文章
|
安全 Java Kotlin
Kotlin泛型:灵活的类型参数化
Kotlin泛型:灵活的类型参数化
128 1
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
112 2
|
12月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
101 3
|
12月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
|
11月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
|
12月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
Kotlin教程笔记(30) - 泛型详解
76 0
|
12月前
|
存储 安全 Java
Kotlin教程笔记(30) - 泛型详解
本教程详细讲解了Kotlin中的泛型概念,包括协变、逆变、类型投影及泛型函数等内容。适合已有Java泛型基础的学习者,深入理解Kotlin泛型机制。快速学习者可参考“简洁”系列教程。
108 0
|
安全 Java 编译器
Android面试题之Java 泛型和Kotlin泛型
**Java泛型是JDK5引入的特性,用于编译时类型检查和安全。泛型擦除会在运行时移除类型参数,用Object或边界类型替换。这导致几个限制:不能直接创建泛型实例,不能使用instanceof,泛型数组与协变冲突,以及在静态上下文中的限制。通配符如<?>用于增强灵活性,<? extends T>只读,<? super T>只写。面试题涉及泛型原理和擦除机制。
125 3
Android面试题之Java 泛型和Kotlin泛型
|
Kotlin
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
Kotlin中接口、抽象类、泛型、out(协变)、in(逆变)、reified关键字的详解
220 0
|
安全 Java 编译器
Kotlin 泛型 VS Java 泛型
Kotlin 泛型 VS Java 泛型
160 0