第十章:泛型
创始人
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());
                       
                  
                  
                  
                  
                  
                  

      相关内容

      热门资讯

      【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
      银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
      不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
      AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
      Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
      北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
      AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
      AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
      ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
      月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...