• java基础 --泛型


    目录

    27、泛型

    1、概念

    2、泛型的语法

    3.使用细节

    自定义泛型类

    自定义泛型接口

    自定义泛型方法

    4.泛型的继承和通配符


    27、泛型

    在没引入泛型之前,传统方法有以下几个问题

    1. 不能对加入到集合中的数据类型进行约束(不安全)

    2. 遍历的时候,需要进行类型转换,如果集合中的数据量很大,对效率有影响

    如果使用泛型

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. /**
    4. * @author: wentao
    5. * @date: 2022/11/2 17:11
    6. * @version: 1.0
    7. * @description: 泛型体验
    8. */
    9. public class Generic_ {
    10.    public static void main(String[]args){
    11.        /*
    12.           1.如果编译器发现添加的类型,不符合要求 ,就会报错
    13.           2. 在遍历的时候,可以直接取出Integer类型而不是Object
    14.         */
    15.        List  list  = new ArrayList();
    16.        list.add(1);
    17.        list.add(12);
    18.        list.add(13);
    19.        //假如不小心输错数据了 添加了一个String类型
    20.        //编译器会进行检查
    21. //       list.add("tom");
    22.        for (Integer integer : list) {
    23.            System.out.println(integer);
    24.       }
    25.   }
    26. }
     
    

    1、概念

    1. 泛型又称为参数化类型,是jdk5出现的新特性,解决数据类型的安全性问题

    2. 在类声明或实例化时,只要指定好需要的具体类型即可

    3. java泛型可以保证如果程序在编译时没有发出警告,运行的时候就不会产生ClassCastException异常,同时,代码更加简洁、健壮

    4. 泛型的作用:可以在类声明时通过一个标识表示 类中某个属性的类型,或者是某个方法的返回值类型,或者是参数类型

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. /**
    4. * @author: wentao
    5. * @date: 2022/11/2 19:26
    6. * @version: 1.0
    7. */
    8. public class Generic2 {
    9.    public static void main(String[]args){
    10.        Person1 p =  new Person1("String");
    11.        System.out.println(p.e.getClass());//class java.lang.String
    12.        Person1 p1 =  new Person1(11);
    13.        System.out.println(p1.e.getClass());//class java.lang.Integer
    14.        Person1 p2 =  new Person1();
    15.        System.out.println(p2.e);//null
    16.   }
    17. }
    18. class Person1 {
    19.    E e;
    20.    public Person1() {
    21.   }
    22.    public Person1(E e) {
    23.        this.e = e;
    24.   }
    25.    @Override
    26.    public String toString() {
    27.        return "Person1{" +
    28.                "e=" + e +
    29.                '}';
    30.   }
    31. }

    2、泛型的语法

    • 泛型的声明

      1. interface 接口 {} 和 class 类 {}

      2. 其中 T,k,v不代表值,而是表示数据类型

      3. 任意字母都可以 指定一般都是使用T,K,V,E这些

    • 泛型的实例化

      1. List list = new ArrayList<>();

      2. Iterator iterator = customers.iterator();

    3.使用细节

    自定义泛型类

    1. 泛型只能是引用数据类型

    2. 在指定泛型具体类型后,可以传入该类型或者其子类型

    3. 如果不添加泛型 默认泛型是Object类型

    4. 普通成员可以使用泛型(属性,方法)

    5. 使用泛型的数组,不能初始化

    6. 静态方法不能使用类的泛型

    7. 泛型类的类型,是在创建对象的时候确定的(因为创建对象的时候,需要指定确定类型)

    1. package com.sofwin.controller;
    2. /**
    3. * @author: wentao
    4. * @date: 2022/11/2 20:36
    5. * @version: 1.0
    6. * @description: 自定义泛型
    7. */
    8. public class CustomGeneric {
    9. }
    10. //1.Tiger类后有泛型 --所以我们吧tiger就称为自定义泛型类
    11. //2. T R M 是泛型标识符,一般是单个大写字母
    12. //3.泛型的标识符可以有多个
    13. //4.普通成员可以使用泛型(属性 方法)
    14. //5. 使用泛型数组不能初始化
    15. //6.静态方法不能使用泛型
    16. //   也是泛型是实例化的时候指定, 但是出发类的时候 可以调用静态方法
    17. //     这个时候不知道泛型的类型
    18. class  Tiger {
    19.    String name;
    20.    R r;  //属性使用了泛型
    21.    T t;
    22.    M m;
    23.    //泛型的类型是对象实例化的时候指定
    24.    //但是这个类中数组 在类加载的时候就初始化了
    25.    // 因此当数组实例化的时候 T还不知道什么类型 无法分配空间
    26.    //因此只能声明 不能实例化
    27. //   T[] ts = new T[8];
    28.    T[] ts ;
    29.    public Tiger(String name, R r, T t, M m) {
    30.        this.name = name;
    31.        this.r = r;
    32.        this.t = t;
    33.        this.m = m;
    34.   }
    35.    public String getName() {
    36.        return name;
    37.   }
    38.    public void setName(String name) {
    39.        this.name = name;
    40.   }
    41.    //返回类型使用泛型
    42.    public R getR() {
    43.        return r;
    44.   }
    45.    //方法使用泛型
    46.    public void setR(R r) {
    47.        this.r = r;
    48.   }
    49.    public T getT() {
    50.        return t;
    51.   }
    52.    public void setT(T t) {
    53.        this.t = t;
    54.   }
    55.    public M getM() {
    56.        return m;
    57.   }
    58.    public void setM(M m) {
    59.        this.m = m;
    60.   }
    61. }

    自定义泛型接口

    1. 接口中,静态成员也不能使用泛型

    2. 泛型接口的类型,在继承接口或者实现接口时确定

    3. 没有指定类型,默认为Object

      1. /**
      2. * @author: wentao
      3. * @date: 2022/11/2 20:58
      4. * @version: 1.0
      5. * @description: 自定义泛型接口
      6. */
      7. public class InterfaceGeneric1 {
      8.    public static void main(String[]args){
      9.   }
      10. }
      11. //没有指定默认是Object
      12. class  UUTsb implements  Usb {
      13.    @Override
      14.    public Object get(Object o) {
      15.        return null;
      16.   }
      17.    @Override
      18.    public void hi(Object o) {
      19.   }
      20.    @Override
      21.    public void run(Object r1, Object r2, Object u1, Object u2) {
      22.   }
      23. }
      24. //实现的时候 可以自行指定了
      25. class  UUsb implements  Usb {
      26.    @Override
      27.    public Float get(Double aDouble) {
      28.        return null;
      29.   }
      30.    @Override
      31.    public void hi(Float aFloat) {
      32.   }
      33.    @Override
      34.    public void run(Float r1, Float r2, Double u1, Double u2) {
      35.   }
      36. }
      37. interface   IUsb extends Usb {
      38. }
      39. /*
      40. 1. 接口中,静态成员也不能使用翻新
      41. 2. 泛型接口的类型,在继承接口或者实现接口时确定
      42. 3. 没有指定类型,默认为Object
      43. */
      44. interface Usb {
      45.    //接口中属性 默认是 public static final的
      46.    public  static  final  int i = 0;
      47. //   U u;
      48.    //普通方法在接口中 可以使用泛型
      49.    R get(U u);
      50.    void  hi(R r);
      51.    void  run(R r1, R r2, U u1, U u2);
      52.    //在jdk8中 可以在接口中,使用默认方法
      53.    default R method(U u) {
      54.        return  null;
      55.   }
      56. }

    自定义泛型方法

    基本语法

    修饰符 返回类型 方法名(参数列表)

    1. 泛型方法,可以定在普通类中,也可以定义的在泛型类中

    2. 当泛型方法被调用时,类型会确定

    3. public void ear(E e ) {} ,修饰符后没有 eat方法不是泛型方法,而是使用了泛型

    1. package com.sofwin.controller;
    2. /**
    3. * @author: wentao
    4. * @date: 2022/11/2 21:30
    5. * @version: 1.0
    6. * @description: 泛型方法
    7. */
    8. public class MethodGeneric1 {
    9.    public static void main(String[]args){
    10.        Car car = new  Car();
    11.        // 当泛型方法被调用时,类型会确定
    12.        //传入值的类型 编译器就自动确定了
    13.        car.fly("str");
    14.        car.fly(1);
    15.   }
    16. }
    17. //泛型方法 可以定义在普通类中,也可以定义在泛型类中
    18. class  Car {
    19.    //普通方法
    20.    public  void run() {}
    21.    //泛型方法
    22.    //就是泛型 是提供给fly使用的
    23.    public void fly(T t) {
    24.        System.out.println(t.getClass());
    25.   }
    26.    public void fly(T t,R r) {
    27.        System.out.println(t.getClass());
    28.   }
    29. }
    30. class  Car2 extends  Car {
    31.    @Override
    32.    public void fly(T t) {
    33.        
    34.   }
    35. }
    36. //也可以定义在泛型类
    37. class  Fish {
    38.     public void  run () {}
    39.     public  void  ear(W w) {}
    40. }

    4.泛型的继承和通配符

    1. 泛型不具备继承性

      List list = new ArrayList() 是不对的

    2. 支持任意泛型类型

    3. 支持A类以及A类的子类,规定了泛型的上限

    4. 支持A类以及A类的父类 不限于直接父类,规定了泛型的下限

      1. import org.omg.CORBA.PUBLIC_MEMBER;
      2. import java.util.ArrayList;
      3. import java.util.List;
      4. /**
      5. * @author: wentao
      6. * @date: 2022/11/2 22:16
      7. * @version: 1.0
      8. * @description: 泛型的基础和通配符
      9. */
      10. public class GenericExtends {
      11.    public static void main(String[]args){
      12.        Object o = new String("xx");
      13.         //1.泛型没有继承性
      14.        //这个就不可以了
      15. //       List list = new ArrayList();
      16.        //举例说明下面的方法
      17.        List list1 = new ArrayList<>();
      18.        List list2 = new ArrayList<>();
      19.        List list3 = new ArrayList<>();
      20.        List list4 = new ArrayList<>();
      21.        List list5 = new ArrayList<>();
      22.        //       1. 支持任意泛型类型
      23.        printCollection(list1);
      24.        printCollection(list2);
      25.        printCollection(list3);
      26.        printCollection(list4);
      27.        printCollection(list5);
      28.        //       2. 支持A类以及A类的子类,规定了泛型的上限
      29.      // printCollection2(list1); //error Object是A类的父类不是子类
      30.      // printCollection2(list2); //error String没有关系
      31.        printCollection2(list3); //ok 是AA类  
      32.        printCollection2(list4); //ok 是AA类的子类
      33.        printCollection2(list5);//ok 是AA类的子类(孙子)
      34.        //       3. 支持A类以及A类的父类 不限于直接父类,规定了泛型的下限
      35.    printCollection3(list1); //ok Object是A类的父类
      36.   // printCollection3(list2); //error String不是 A类的父类  
      37.    printCollection3(list3);  //AA类是可以的
      38.   // printCollection3(list4);//error 是AA类的子类
      39.   // printCollection3(list5);//error 是AA类的子类(孙子)
      40.   }
      41.    //       1. 支持任意泛型类型
      42.    public static  void printCollection(List c) {
      43.        for (Object o : c) {
      44.            System.out.println(o);
      45.       }
      46.   }
      47.    
      48.    //       2. 支持A类以及A类的子类,规定了泛型的上限
      49.    public static  void printCollection2(List c) {
      50.        for (Object o : c) {
      51.            System.out.println(o);
      52.       }
      53.   }
      54.    //       3. 支持A类以及A类的父类 不限于直接父类,规定了泛型的下限
      55.    public static  void printCollection3(Listsuper   AA> c) {
      56.        for (Object o : c) {
      57.            System.out.println(o);
      58.       }
      59.   }
      60. }
      61. class  AA {
      62.    
      63. }
      64. class  BB extends AA {
      65.    
      66. }
      67. class  CC extends  BB {
      68.    
      69. }
      70. 相关阅读:
        jenkins升级及基于jeecgboot 的nbcio-boot前端演示发布
        前端postMessage跨域通讯
        网络协议--IP选路
        Javascript 中的堆、栈、引用和值指南
        Golang Linux 安装与环境变量配置
        Java开发面试常见的技术问题整理
        python的数据类型转换以及运算符
        【LeetCode-198】打家劫舍(回溯&动归)
        聚酰胺改性乳清白蛋白/肌白蛋白/豆清白蛋白/蓖麻蛋白/豌豆白蛋白1b ( PA1b)纳米粒
        代码管理(新手)
      71. 原文地址:https://blog.csdn.net/weixin_52574640/article/details/127734561