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

      相关内容

      热门资讯

      保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
      汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
      不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
      表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
      本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
      不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
      表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
      Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
      【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
      银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...