• Java(七)——集合框架---泛型Generic


    1 泛型 Generic

    泛型技术是JDK版本一大升级,源自于JDK1.5

    泛型就是集合类<泛型>  

    1. //无泛型写法
    2. public static void main(String[] args) {
    3. /**
    4. * JDK没有泛型技术,就是这样写
    5. * 集合可以存储任何数据类型
    6. * 添加元素的数据类型是Object
    7. */
    8. List list = new ArrayList();
    9. list.add("a");
    10. list.add(1);
    11. Iterator it = list.iterator();
    12. while (it.hasNext()){
    13. Object obj = it.next();//不能类型转换 //类型转换异常
    14. System.out.println(obj);
    15. }
    16. }

    1.1泛型的安全机制

    软件升级 : 安全性提高,修复Bug错误,改善用户体验,增加功能,提升性能

    JDK1.5里程碑版本

    泛型 作用 : 强制了集合存储固定的数据类型

    泛型的书写格式 :

    1. 集合类<存储的数据类型> 变量名 = new 集合类<存储的数据类型>();
    2. 类型可以不写:钻石操作符

    加入泛型后,程序的安全性提升了

    1. public static void main(String[] args) {
    2. /**
    3. * JDK没有泛型技术,就是这样写
    4. * 集合可以存储任何数据类型
    5. * 添加元素的数据类型是Object
    6. */
    7. List list = new ArrayList();
    8. list.add("a");
    9. list.add(1); //编译错误,数据类型不匹配
    10. Iterator it = list.iterator();
    11. while (it.hasNext()){
    12. String obj =it.next(); //类型转换不需要
    13. System.out.println(obj);
    14. }
    15. }
    • 使用泛型的好处 :

      • 安全性提高了

      • 程序的代码量减少

      • 避免了类型的强制转换

      • 程序的问题,由运行时期,提前到编译时期

    1.2 泛型中的 E 问题

    E没有什么实际价值,只是一个变量而已

    特殊 : 等待接收指定的数据类型

    1. ArrayList
    2. //创建对象
    3. ArrayList al = new ArrayList();
    4. E 不在是E了,变成String
    5. public boolean add(String e) {
    6. }

    1.3 自定义泛型类

    1. /**
    2. * 定义类,类名叫工厂
    3. * 自定义泛型类
    4. * Factory<什么都可以写> 只是变量名而已
    5. */
    6. public class Factory {
    7. private QQ q;
    8. public void setQ(QQ q){
    9. this.q = q;
    10. }
    11. public QQ getQ(){
    12. return q;
    13. }
    14. }
    1. public static void main(String[] args) {
    2. //创建对象Factory类对象
    3. // Factory factory = new Factory();//没有泛型,QQ就是Object
    4. Factory factory = new Factory();
    5. factory.setQ("abc");
    6. String s = factory.getQ();
    7. System.out.println(s);
    8. Factory factory2 = new Factory();
    9. factory2.setQ(1.5);
    10. Double q = factory2.getQ();
    11. System.out.println(q);
    12. }

    1.4 泛型方法

    1. /**
    2. * 泛型的方法,方法参数上
    3. */
    4. public class Factory {
    5. /*
    6. * 静态方法
    7. * Q是非静态的, Q的数据类型,是new的时候指定的
    8. *
    9. * 静态方法参数中的泛型,不能和类一样
    10. * 静态方法的泛型,需要在方法上单独定义
    11. * 写在返回值类型的前面
    12. * 在调用时由于没有指定参数类型,所以可以随意传入任何参数。
    13. */
    14. public static void staticMethod(T q){
    15. System.out.println(q);
    16. }
    17. public void print(Q q){
    18. System.out.println(q);
    19. }
    20. }

    1.5 泛型接口

    • 实现类实现接口,不实现泛型

    • 实现类实现接口,同时指定泛型

    1. //泛型接口
    2. public interface Inter {
    3. public abstract void inter(T t);
    4. }
    1. /**
    2. * 实现接口,不理会泛型
    3. * 对象创建的时候,指定类型
    4. * Inter in = new InterImpl ();
    5. * in.inter("true123");//true123
    6. */
    7. public class InterImpl implements Inter{
    8. public void inter(T t){
    9. System.out.println(t);
    10. }
    11. }
    1. /**
    2. * 实现接口,同时指定泛型
    3. */
    4. public class InterImpl2 implements Inter {
    5. public void inter(String s) {
    6. System.out.println("s=="+s);
    7. }
    8. }
    1. public class GenericTest {
    2. public static void main(String[] args) {
    3. Inter in = new InterImpl();
    4. in.inter("ok");
    5. Inter in2 = new InterImpl2();
    6. in2.inter("kkk");
    7. }
    8. }

    1.6 泛型通配符“ ?”  

    1. //泛型的通配符
    2. public class GenericTest {
    3. public static void main(String[] args) {
    4. List stringList = new ArrayList();
    5. stringList.add("abc");
    6. stringList.add("bbc");
    7. List integerList = new ArrayList();
    8. integerList.add(1);
    9. integerList.add(2);
    10. each(stringList);
    11. each(integerList);
    12. }
    13. /**
    14. * 定义方法,可以同时迭代器 遍历这两个集合
    15. * 方法的参数,是要遍历的集合,不确定是哪个集合
    16. * 定义参数,写接口类型,不要写实现类
    17. */
    18. public static void each(List list){
    19. Iterator it = list.iterator();
    20. while (it.hasNext()){
    21. Object obj = it.next();
    22. System.out.println(obj);
    23. }
    24. }
    25. }

    1.7 泛型限定

    泛型限定 : 限制的是数据类型

    •   传递类型可以是Company或者是他的子类

    •   传递E类型或者是E的子类,泛型上限限定

    •   传递E类型或者是E的父类,泛型下限限定

    1. public static void main(String[] args) {
    2. //创建集合,存储员工对象
    3. //开发部的
    4. List devList = new ArrayList();
    5. //存储开发部员工对象
    6. Development d1 = new Development();
    7. d1.setName("张三");
    8. d1.setId("开发部001");
    9. Development d2 = new Development();
    10. d2.setName("张三2");
    11. d2.setId("开发部002");
    12. devList.add(d1);
    13. devList.add(d2);
    14. //财务部集合
    15. List finList = new ArrayList();
    16. Financial f1 = new Financial();
    17. f1.setName("李四");
    18. f1.setId("财务部001");
    19. Financial f2 = new Financial();
    20. f2.setName("李四2");
    21. f2.setId("财务部002");
    22. finList.add(f1);
    23. finList.add(f2);
    24. System.out.println(devList);
    25. System.out.println(finList);
    26. each(devList);
    27. each(finList);
    28. // List integerList = new ArrayList<>();
    29. // integerList.add(1);
    30. // each(integerList);
    31. }
    32. /**
    33. * 要求 : 定义方法
    34. * 同时遍历2个集合
    35. * 遍历的同时取出集合元素,调用方法work()
    36. * ? 接收任何一个类型
    37. * 只能接收 Company和子类对象
    38. * 明确父类,不能明确子类
    39. */
    40. public static void each(List list){
    41. Iteratorextends Company> it = list.iterator();
    42. while (it.hasNext()){
    43. //取出元素
    44. Company obj =it.next();
    45. obj.work();
    46. }
    47. }

  • 相关阅读:
    编写一个Mybatis程序
    【我是产品经理_注册安全分析报告】
    使用keil反汇编时的记录
    java计算机毕业设计游泳馆信息管理系统源码+数据库+系统+部署+lw文档
    Spring基于Annotation装配Bean
    【边缘检测】基于蚁群算法实现图像边缘检测附matlab代码
    PPO算法逐行代码详解
    【Python大数据笔记_day05_Hive基础操作】
    【DETR源码解析】二、Backbone模块
    azure devops工具实践分析
  • 原文地址:https://blog.csdn.net/MrDaKai/article/details/127774562