第十章:泛型
创始人
2024-05-30 07:45:47
0

第十章:泛型

10.1:为什么要有泛型

  1. 泛型的概念

    ​ 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用是确定。

  2. 不用泛型的缺点

    • 任何类型都可以添加到集合中:类型不安全
    • 读取出来的对象需要强转:繁琐,可能有ClassCastException
  3. 使用泛型的优点

    • 只有指定类型才可以添加到集合中:类型安全。
    • 读取出来的对象的不需要强转:便捷。

10.2:在集合中使用泛型

  • 集合接口或集合类在jdk 5.0时都修改为带泛型的结构。
  • 在实例化集合是,可以指明具体的泛型类型。
  • 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化的泛型类型
  • 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换。
  • 如果实例化时,没有指明泛型。默认类型为java.lang.Object
// 在ArrayList中使用泛型
@Test
public void test2() {ArrayList list = new ArrayList();list.add(78);list.add(87);list.add(99);list.add(65);//list.add("Tom"); // 会报错for(Integer score: list) {int stuScore = score;System.out.println(stuScore);}
}
// 在HashMap中使用泛型
@Test
public void test3() {Map map = new HashMap();map.put("Tom", 87);map.put("Jerry", 87);map.put("Jack", 67);//map.put(123, "ABC"); // 会报错// 泛型的嵌套Set> entrys = map.entrySet();Iterator> iterator = entrys.iterator();while(iterator.hasNext()) {Map.Entry e = iterator.next();String key = e.getKey();Integer value = e.getValue();System.out.println(key + "----" + value);}
}

10.3:自定义泛型结构

  1. 自定义泛型类、接口

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

      public class Order {}
      
    • 泛型类的构造器如下:

      // 正确的
      public Order() {}
      // 错误的
      // public Order {}
      
    • 实例化后,操作原来泛型位置的结构必须与指定的泛型类型一致。

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

      ArrayList list1 = new ArrayList<>();
      ArrayList list2 = new ArrayList<>();
      // 报错
      // list1 = list2;
      
    • 泛型如果不指定,将被擦除,泛型对应的类型均按照Object处理,但不等价于Object经验:泛型要使用一路使用。要不用,一路都不要用。

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

    • 异常类不能是泛型的。

    • 不能使用new T[]。但是可以T[] arr = (E[]) new Object[capacity]

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

      1. 子类不保留父类的泛型:按需实现
        • 没有类型:擦除
        • 具体类型
      2. 子类保留父类的泛型:泛型子类
        • 全部保留
        • 部分保留
  2. 泛型方法

    ​ 方法,也可以被泛型化,不管此时定义在其中的类是不是泛型类。在泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据的类型。

    • 泛型方法的格式

      [访问权限] <泛型> 返回类型 方法名([泛型标识 参数名称]) 抛出的异常 {}
      
    • 泛型方法示例

      public static  List copyFromArrayToList(E[] arr) {ArrayList list = new ArrayList<>();for(E e: arr) {list.add(e);}return list;
      }
      

10.4:泛型在继承上的体现

如果BA的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G并不是G的子类型!

List list1 = null;
List list2 = null;
list1 = list2; // 报错,编译不通过
 

10.5:通配符的使用

  1. 类型通配符?

    • ListListList等各种泛型List的父类。

    • 读取List的对象list中的元素时,永远是安全的,因为不管list的真实类型是什么,它包含的都是Object

    • 写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中添加对象。

      唯一的例外是null,它是所有类型的成员。

    • 注意点

      • 不能在泛型方法声明上,返回值类型前面<>不能使用。

        public static  void test(ArrayList list) {}
        
      • 不能用在泛型类的声明上

        class GenericTypeClass {}
        
      • 不能用在创建对象上,右边属于创建集合对象。

        ArrayList list2 = new ArrayList();
        
    • 有限制的通配符

      • 通配符指定上限:extends

        使用时指定的类型必须是继承某个类,或者实现某个接口。即<=

      • 通配符指定下限:super

        使用时指定的类型不能小于操作的类,即>=

      List list1 = null;
      List list2 = null;List list3 = new ArrayList();
      List list4 = new ArrayList();
      List list5 = new ArrayList();list1 = list3;
      list1 = list4;
      // list1 = list5;// list2 = list3;
      list2 = list4;
      list2 = list5;list1 = list3;
      Person p = list1.get(0);
      // Student s = list1.get(0);list2 = list4;
      Object obj = list2.get(0);
      // Person obj1 = list2.get(0);// list1.add(new Student());
      list2.add(new Person());
      list2.add(new Student());
                       
                  
                  
                  
                  
                  
                  

      相关内容

      热门资讯

      前端-session、jwt 目录:   (1)session (2&#x...
      linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
      关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
      前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
      nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
      JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
      无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
      fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
      常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
      <C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...