JavaSE---泛型系统学习
1、概述
1.1、泛型:
允许在 定义 类、接口、方法时 使用 类型形参,这个类型形参 将在声明变量、创建对象、调用方法时 动态地指定;
1.2、jdk5后,引入了 参数化类型(允许程序在创建集合时指定集合元素的类型) 的概念;
1.3、Java的参数化类型 被称为 泛型;
1.4、jdk7之前,使用带泛型的接口,调用构造器创建对象时构造器后必须带泛型;
jdk7后,只需要带'<>'即可;
eg:
//jdk7之前 List<String> list=new ArrayList<String>();
//jdk7后 List<String> list2=new ArrayList<>();
2、自定义泛型接口、泛型类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | /** * 自定义泛型类 * @param <T> element's type */ private static class Mine<T>{ //***构造器 无需加泛型 private Mine(){ } } /** * 自定义泛型接口 * @param <E> element */ private static interface My<E>{ void say(); } 使用: Mine<String> mine= new Mine<>(); |
3、泛型接口/类 派生子类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /** * 自定义泛型接口 * @param <E> element */ private static interface My<E>{ void say(); } /** * 泛型接口/类 派生子类 * ****泛型接口可不指定泛型类型 */ private static class Zi implements My{ @Override public void say() { } } /** * 泛型接口/类 派生子类 * ****泛型接口可指定泛型类型 */ private static class Zi2 implements My<String>{ @Override public void say() { } } |
4、类型通配符
4.1、 使用 泛型类 时,都应该 为泛型类 传入一个类型实参(若没有传入类型实参,编译器会发出泛型警告);
4.2、 Java泛型设计的原则:只要代码在编译期没有出现警告,就不会遇到运行时ClassCastException;
4.3、 类型通配符: 是一个问号'?',将一个问号作为 类型实参 传入; eg:List<?>
5、设定类型通配符的上限
5.1、 有时候 不需要 作为所有类型的父类,只需要 代表某一类型的父类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /** * 自定义泛型接口 * @param <E> element */ private static interface My<E>{ void say(); } /** * 泛型接口/类 派生子类 * ****泛型接口可不指定泛型类型 */ private static class Zi implements My{ @Override public void say() { } } /** * 类型通配符上限 */ private static class A{ public void say(List<? extends Zi> list){ } } |
6、设定类型形参的上限
6.1、Java支持 在定义类型形参时设定上限;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /** * 设定 类型形参 上限(单个上限) * @param <T> */ private static class B<T extends String>{ } /** * 设定 类型形参 上限(多个上限) * @param <T> */ private static class C<T extends String & Serializable>{ } |
7、自定义泛型方法
7.1、泛型方法 :
声明方法时,定义一个或多个类型形参;
7.2、语法:
修饰符 <T,S> 返回值类型 方法名(形参列表){方法体...}
7.3、与普通方法的区别:
a,多了类型形参声明;
b,类型形参使用<>,多个以','分隔,位于 修饰符与方法返回值之间;
1 2 3 4 5 6 7 8 9 | /** * 泛型方法 */ private static class D{ private <T extends String> void say(T t){ } } |
8、设定通配符的下限
8.1、super
1 2 3 4 5 6 7 8 9 10 | /** * 设定 通配符 下限 */ private static class E{ private <T> void say(List<? super T> list){ } } |
9、反射与泛型
9.1、jdk5后,Java为Class类增加了泛型,eg :Class<?>; 避免使用反射生成的对象需要类型强制转换;
10、泛型的优势:
1.1、编译时检测类型(避免 ClassCastException);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?