当前位置: 首页 > news >正文

Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例+代码)

文章目录

  • 泛型
    • 21.1 概述
    • 21.2 泛型类
    • 21.3 泛型方法
    • 21.4 泛型接口

泛型

21.1 概述

JDK5中引入的特性,在编译阶段约束操作的数据类型,并进行检查

泛型格式:<数据类型>

泛型只能支持引用数据类型,如果写基本数据类型需要写对应的包装类。

泛型好处:

  • 统一数据类型
  • 把运行时期的问题提到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。

泛型细节:

  • 泛型中不能写基本数据类型

    因为基本数据类型不能转成Object类型,包装类才能转成Object类型

  • 指定泛型后传递数据时,可以传入该类类型或者其子类类型

  • 如果不写泛型,类型默认是Object

21.2 泛型类

使用场景:当一个类中,某个变量的数据类型不确定时,可以定义带有泛型的类。

格式:修饰符 class 类名<类型>{....}举例:E可以理解为变量,但不是变量,不是记录数据的,是用来记录数据类型的public class ArrayList<E>{//.....  当创建给类对象时,E就确定类型}
//自定义泛型类
public class MyArrayList<E>{Object[] obj = new Object[5];int size; // size:表示长度,即存了几个元素// E:表示不确定的类型// e:形参的名字,变量名// 添加元素public boolean add(E e){obj[size] = e;size++;return true;}// 获取元素public E get(int index){return (E) obj[index];}// 重写toString方法@Overridepublic String toString() {return Arrays.toString(obj);}
}
==================================================public class Test {public static void main(String[] args) {//创建自己定义泛型类的对象MyArrayList<String> list = new MyArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");System.out.println(list);//[aaa, bbb, ccc, null, null]String s = list.get(0);System.out.println(s);//aaaMyArrayList<Integer> list1 = new MyArrayList<>();list1.add(1);list1.add(2);list1.add(3);Integer integer = list1.get(1);System.out.println(integer);//2}
}

21.3 泛型方法

方法中形参类型不确定时:

  • 方案1:使用类名后定义的泛型(如21.2中的add方法)

    在本类里所有方法都可以用

  • 方案2:在方法申明上定义自己的泛型

    只有本方法能用

格式:修饰符 <类型> 返回值类型 方法名(类型 变量名){}
举例:public <T> void show(T t){// 调用该方法时,T才能确定类型
}
public class ListUtil {// 私有化构造方法,不让外界本类的对象private ListUtil(){}// 类中定义静态方法addAll, 用来添加多个集合的元素
//public static <E> void addAll(ArrayList<E> list,E e1,E e2){//     list.add(e1);//     list.add(e2);// }//可变参数 E...epublic static <E> void addAll(ArrayList<E> list,E...e){for (E element : e) {list.add(element);}}public void show(){System.out.println("这是自定义工具类....");}}
==========================================public class Test {public static void main(String[] args) {// 在创建对象时,就可以确定泛型方法的形参类型ArrayList<String> list = new ArrayList<>();ListUtil.addAll(list,"6","8");System.out.println(list);//[6, 8]ArrayList<Integer> list2 = new ArrayList<>();ListUtil.addAll(list2,5,1);System.out.println(list2);//[5, 1]}
}

21.4 泛型接口

格式:修饰符 interface 接口名<类型>{}举例:public interface List<E>{}泛型接口的两种使用方式:1.实现类给出具体的类型2.实现类延续泛型,创建实现类对象时再确定类型
// 1.实现类给出具体的类型,实现List接口
public class MyArrayList2 implements List<String> {// 省略重写List里的抽象方法
}
==================================================public class Test {public static void main(String[] args) {//MyArrayList集合中只能存字符串,//创建MyArrayList对象时不用指定泛型MyArrayList list = new MyArrayList();list.add("666");}
}
// 2.实现类延续泛型,创建实现类对象时再确定类型
public class MyArrayList02<E> implements List<E> {// 省略重写List里的抽象方法
}
==================================================public class Test02 {public static void main(String[] args) {// 2.实现类延续泛型,创建实现类对象时再确定类型MyArrayList02<Integer> list = new MyArrayList02<>();list.add(6);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 6--SpringBootWeb案例(详解)
  • springboot实战学习笔记(2)
  • vue项目中,属性表头默认为横向排列,却没有纵向排列的组件或相关属性,如何将其纵向排列?
  • vivado中选中bd文件后generate output product是什么用,create HDL wrapper是什么用
  • Java | Leetcode Java题解之第414题第三大的数
  • 检查和测绘室内防撞无人机技术详解
  • 828华为云征文|Flexus X实例Docker+Jenkins+gitee实现CI/CD自动化部署-解放你的双手~
  • Qt 模型视图(四):代理类QAbstractItemDelegate
  • 3D GS 测试自己的数据
  • 深入剖析:C++类对象的内存布局与优化
  • Java 技巧 如何在IDEA2024 中快速打出System.out.println();
  • Stable Diffusion Fooocus批量绘图脚本
  • 地平线秋招2025
  • GPT撰写开题报告教程——课题确定及文献调研
  • 基于jupyter notebook + joint-spider爬虫数据的成都二手房数据可视化分析项目源代码+详细使用说明
  • C学习-枚举(九)
  • JS实现简单的MVC模式开发小游戏
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python 基础起步 (十) 什么叫函数?
  • Python实现BT种子转化为磁力链接【实战】
  • 初识 beanstalkd
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 如何合理的规划jvm性能调优
  • 入门级的git使用指北
  • 实战|智能家居行业移动应用性能分析
  • 为视图添加丝滑的水波纹
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 【云吞铺子】性能抖动剖析(二)
  • const的用法,特别是用在函数前面与后面的区别
  • Java总结 - String - 这篇请使劲喷我
  • kubernetes资源对象--ingress
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • # Redis 入门到精通(一)数据类型(4)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (12)Linux 常见的三种进程状态
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (42)STM32——LCD显示屏实验笔记
  • (Git) gitignore基础使用
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (三分钟)速览传统边缘检测算子
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • ./configure,make,make install的作用
  • .NET CLR Hosting 简介
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .netcore 获取appsettings
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Autowired 与@Resource的区别
  • @javax.ws.rs Webservice注解