java泛型理解

简介: 集合容器类在设计阶段 / 声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以 在 JDK1.5 之前只能把元素类型设计为 Object , JDK1.5 之后使用泛型来解决。

为什么要有泛型 (Generic)



泛型: 标签


举例:

中药店,每个抽屉外面贴着标签

超市购物架上很多瓶子,每个瓶子装的是什么,有标签


泛型的设计背景

集合容器类在设计阶段 / 声明阶段不能确定这个容器到底实际存的是什么类型的

对象,所以 在 JDK1.5 之前只能把元素类型设计为 Object , JDK1.5 之后使用泛型来

解决。 因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于

这个元素如何保存,如何管理等是确定的,因此此时 把元素的类型设计成一个

参数,这个类型参数叫做泛型。 Collection<E> , List<E> , ArrayList<E> 这个 <E> 就是类型参数,即泛型。


0370234a57ca4249993dd8a57c827c37.png4d3b9726173e458ba105d93cde555a4d.png0f3ba45e96f146e9bfb8ea9a570b4e8c.png

 

在集合中使用泛型


c1b81f8d81c540378a00f9ec6afdef25.pngbc0e64d1056242878f615fc9fd201ac9.png


自定义泛型结构



14d2bbdb2a3d41638eb111d4cb08f0a6.png7a0fdf5a2d054a99a048684815f40dc6.png


自定义泛型结构:泛型类、泛型接口



1. 泛型类可能有多个参数,此时应将多个参数一起放在尖括号内。比如:

<E1,E2,E3>

2. 泛型类的构造器如下: public GenericClass(){} 。

而下面是错误的: public GenericClass<E>(){}

3. 实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。

4. 泛型不同的引用不能相互赋值。

> 尽管在编译时 ArrayList<String> 和 ArrayList<Integer> 是两种类型,但是,在运行时只有

一个 ArrayList 被加载到 JVM 中。

5. 泛型如果不指定,将被擦除,泛型对应的类型均按照 Object 处理,但不等价

于 Object 。 经验: 泛型要使用一路都用。要不用,一路都不要用。

6. 如果泛型结构是一个接口或抽象类,则不可创建泛型类的对象。

7. jdk1.7 ,泛型的简化操作: ArrayList<Fruit> flist = new ArrayList<>();

8. 泛型的指定中不能使用基本数据类型,可以使用包装类替换


eb6d7eb2aeaf4134be3140a2942c45a1.png


9. 在类 / 接口上声明的泛型,在本类或本接口中即代表某种类型,可以作为非静态 属性的类型、非静态方法的参数类型、非静态方法的返回值类型。但在 静态方法 中不能使用类的泛型。

10. 异常类不能是泛型的

11. 不能使用 new E[] 。但是可以: E[] elements = (E[])new Object[capacity];

参考: ArrayList 源码中声明: Object[] elementData ,而非泛型参数类型数组。

12. 父类有泛型,子类可以选择保留泛型也可以选择指定泛型类型:

子类不保留父类的泛型:按需实现

没有类型 擦除

 具体类型

 子类保留父类的泛型:泛型子类

 全部保留

部分保留


结论:子类必须是“富二代”,子类除了指定或保留父类的泛型,还可以增加自

己的泛型


11a4d2e5791c4f08b1a7914ad35d79fa.png0fd1ed0dfb284e579b6f134c909c5348.pngc0980ddbfeed4f838655100c3fa9c0bd.png


泛型在继承上的体现


0104a47f0c42415ca90d2707fa5c4ad6.pngcc6a3643368f481785c24ae61c8294e6.png


通配符的使用



35fd87822f5e46209c2f37b54c097117.pngf7da9cc33f2443f4b6d8ff76d67bdd79.png549b5670e24847c39b135ae9cdda2354.pngcb0096a12163453c8b88e8f11bad8f6c.pngad4d3222171e4e76bb69d3c2a0adff55.png

相关文章
|
3月前
|
安全 Java 编译器
揭秘JAVA深渊:那些让你头大的最晦涩知识点,从泛型迷思到并发陷阱,你敢挑战吗?
【8月更文挑战第22天】Java中的难点常隐藏在其高级特性中,如泛型与类型擦除、并发编程中的内存可见性及指令重排,以及反射与动态代理等。这些特性虽强大却也晦涩,要求开发者深入理解JVM运作机制及计算机底层细节。例如,泛型在编译时检查类型以增强安全性,但在运行时因类型擦除而丢失类型信息,可能导致类型安全问题。并发编程中,内存可见性和指令重排对同步机制提出更高要求,不当处理会导致数据不一致。反射与动态代理虽提供运行时行为定制能力,但也增加了复杂度和性能开销。掌握这些知识需深厚的技术底蕴和实践经验。
78 2
|
28天前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
25 0
[Java]泛型
|
1月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
11 1
|
1月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
27 5
|
1月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
19 1
|
2月前
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
37 9
Java——包装类和泛型
|
1月前
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
20 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
1月前
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
16 0
|
2月前
|
存储 安全 搜索推荐
Java中的泛型
【9月更文挑战第15天】在 Java 中,泛型是一种编译时类型检查机制,通过使用类型参数提升代码的安全性和重用性。其主要作用包括类型安全,避免运行时类型转换错误,以及代码重用,允许编写通用逻辑。泛型通过尖括号 `&lt;&gt;` 定义类型参数,并支持上界和下界限定,以及无界和有界通配符。使用泛型需注意类型擦除、无法创建泛型数组及基本数据类型的限制。泛型显著提高了代码的安全性和灵活性。
下一篇
无影云桌面