当前位置: 首页 > news >正文

【JavaEE进阶系列 | 从小白到工程师】泛型的详细介绍使用与类型通配符,直接上手

文章目录

  • 💨更多相关知识👇
    • 一、什么是泛型
    • 二、泛型的好处
    • 三、泛型的定义格式
    • 四、可以定义泛型的地方
    • 五、泛型类
      • 🍂泛型类的定义格式
        • 🌟代码演示
      • 🍂泛型类的使用
    • 六、泛型接口
      • 🍂泛型接口的定义格式
        • 🌟代码演示
          • 情况1:普通实现类实现泛型接口(当类没有泛型的时候,实现泛型接口的时候,就给它确定类型)
          • 情况2:泛型类实现泛型接口 (实现类的泛型可以传给接口的泛型然后找机会确定类型)
      • 🍂泛型接口使用
    • 七、泛型方法
      • 🍂 泛型方法定义格式
        • 🌟代码演示
      • 🍂泛型方法使用
    • 八、类型通配符
      • 🍂类型通配符 ?
      • 🍂使用注意
      • 🍂类型通配符上下限
        • (1)类型通配符上限
        • (2)类型通配符下限
        • 🌟代码演示
    • 九、泛型的注意
  • 作者:KJ.JK

💨更多相关知识👇

💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇)

💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇)

💖Spring中的依赖注入、setter与构造器注入、自动装配与集合注入详细描述及使用(XML版中篇)

💖异常处理与解决方案详解上篇

💖异常处理与解决方案详解下篇

💖Math类与System类的常用方法使用

💖JavaEE中的静态方法定义、方法重载要求、return作用详解

💖List接口的常用方法,精华总结

💖JavaEE中的Stream流的常用方法

💖JavaEE中的Stream流知识点使用,精华总结,一文直接上手


🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈
 
🍂个人博客首页: KJ.JK
 
欢迎大家点赞👍收藏💖评论💬关注🔒
 
💖源码获取 | 💻学习交流 | 🤝商务合作 | 💨私信作者
 
💨推荐一款实用的模拟面试、刷题练习算法的神器、适用于所有的程序猿👉点击开始免费刷题,跟着博主走上巅峰💪


一、什么是泛型


               泛型:"JDK5"中引入的特性,它提供了"编译时类型安全检测机制"

二、泛型的好处


            * 把运行时期的问题提前到了编译期间
        
            * 避免了强制类型转换
            
            * 顾名思义,就是"将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型"

            * 这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口
            
//存入的时候没有限制类型,拿出来的时候,不知道用什么类型来接,可以定义泛型       

三、泛型的定义格式


   *     <类型>

               尖括号里面可以任意书写,按照变量的定义规则即可,一般只写一个大写字母
                
          比如:<E>      <T> 


  *     <类型1,  类型2>  

              指定多种泛型格式,多种类型之间用逗号隔开
           
        比如:<K, V> 

四、可以定义泛型的地方


    *     定义在类后面(泛型类) ArrayList<E>
    
    *     定义在接口后面(泛型接口)  Iterator<E>
    
    *     定义在方法申明上(泛型方法)

五、泛型类


🍂泛型类的定义格式


         格式:
               修饰符 class 类名<泛型标记> {   }

         范例:
               public class Student<T> {  }

//此处<>中可以随便写个任意标识,常见的如T、E、K、V等形式的代号常用于表示泛型

🌟代码演示

//泛型类
//<E> 代表某一种数据类型
public class Box<E> {

    public E getValue() {

        return value;
    }

    public void setValue(E value) {

        this.value = value;
    }

    private E value;



}

public class Test {

    /*
     泛型定义格式
          public class 类名<泛型>{

          }

      确定泛型的时机
           创建对象时,确定泛型的类型
     */
    public static void main(String[] args) {

          //创建泛型类的对象
        Box <Integer> b1=new Box<>();

        b1.setValue(13);
        Integer value = b1.getValue();
        System.out.println(value);


        Box <String> b2=new Box<>();
        b2.setValue("张三");
        String s2=b2.getValue();
        System.out.println(s2);

    }
}


请添加图片描述


🍂泛型类的使用

            *  泛型类在创建对象时确定泛型的真实类型

            *  类中引用到泛型的地方都会替换成具体类型

六、泛型接口


🍂泛型接口的定义格式


       格式:
             修饰符  interface  接口名<泛型标记> {   }
             
       范例:
             public interface MyList<T> {  }


🌟代码演示

//泛型接口
public interface MyList<E> {

    void add (E s);

    E get(int index);


}


情况1:普通实现类实现泛型接口(当类没有泛型的时候,实现泛型接口的时候,就给它确定类型)

//实现接口的时候,确定泛型的类型

public class MyArrayList implements  MyList<String>{


    @Override
    public void add(String s) {

    }

    @Override
    public String get(int index) {
        return null;
    }
}

//当类没有泛型的时候,实现泛型接口的时候,就给它确定类型

情况2:泛型类实现泛型接口 (实现类的泛型可以传给接口的泛型然后找机会确定类型)
//当实现类也是泛型的时候,那么实现类的泛型可以传给接口
public class MyArray <T> implements  MyList<T>{

    @Override
    public void add(T s) {

    }

    @Override
    public T get(int index) {
        return null;
    }
}


public class Demo {
    public static void main(String[] args) {

        MyArray<String> my=new MyArray<>();
    }
}

请添加图片描述


请添加图片描述


🍂泛型接口使用

            * 实现类"实现接口""确定泛型"

            * 接口中引用泛型的地方会替换成具体类型

七、泛型方法


🍂 泛型方法定义格式


              格式: 
                      修饰符 <泛型标记> 返回值类型 方法名(类型 变量名) {  }
                      
              范例:
                      public  <T>  void  show(T  t) {  }
     

🌟代码演示

public class Main {
    public static void main(String[] args) {


//        int [] arr1={11,22,33};
//        printArray(arr1);     //泛型只能接受引用类型


        Integer [] arr={11,22,33};
        printArray(arr);


        String [] arr3={"a","b"};
        printArray(arr3);
    }




              //<T> 这里是定义泛型       //使用泛型
    public  static <T> void printArray(T [] arr){

        System.out.print("[");

        for (int i = 0; i < arr.length; i++) {
            if(i== arr.length-1){
                System.out.print(arr[i]);
            }else{
                System.out.print(arr[i]+",");
            }
        }
        System.out.println("]");
    }



//    未使用泛型的时候,只能使用int传参
//    public  static  void printArray(int [] arr){
//
//        System.out.print("[");
//
//        for (int i = 0; i < arr.length; i++) {
//            if(i== arr.length-1){
//                System.out.print(arr[i]);
//            }else{
//                System.out.print(arr[i]+",");
//            }
//        }
//        System.out.println("]");
//    }


}


请添加图片描述


🍂泛型方法使用

      *   调用方法,"传参时确定泛型类型"
      
      *   方法中"引用泛型的地方"会替换成"具体类型"

八、类型通配符


🍂类型通配符 ?


        当使用泛型的时候,无法确定泛型的具体类型时,可以使用通配符 ? 来表示某一种类型

🍂使用注意


      * 泛型通配符 <?> 是在"使用泛型"的时候,用来代表某种类型的符号

      * 前面出现的 "<E> <T> " 等,虽然也是代表某种类型,但是在"定义泛型"的时候使用的

🍂类型通配符上下限


(1)类型通配符上限


               格式 :
                     <? extends  父类>  表示类型只能是 "父类" 或者 "父类的子类"     (上限)
               范例 :
                     <? extends  car>  表示类型只能是 "car" 或者 "car的子类"      (上限)      
                     
//最高为父类

(2)类型通配符下限

               格式 :
                     <? super  父类>  表示类型只能是 "父类" 或者 "父类的父类"     (下限)   
               范例 :
                     <? super  car>  表示类型只能是 "car" 或者 "car的父类"      (下限)      
                         
//最低为父类

🌟代码演示

import java.util.ArrayList;
import java.util.regex.Pattern;

public class QQplay {
    public static void main(String[] args) {

        //上限
//        ArrayList<Audi> audis =new ArrayList<>();
//        audis.add(new Audi());
//        audis.add(new Audi());
//
//        play(audis);
//
//        ArrayList<Jeep> jeeps =new ArrayList<>();
//
//        play(jeeps);




        //下限
        ArrayList<car> cars=new ArrayList<>();
        play(cars);


        ArrayList<Object> obj=new ArrayList<>();
        play(obj);




    }

    //<?> 泛型通配符, ?表示可以匹配任意类型
    //通配符可以规定类型的上限和下限

    //<? extends  car>  表示类型只能是car 或者car的子类 (上限)
//    public   static   void play(ArrayList<? extends  car> list){
//
//    }

//    <? super  car> 表示类型只能是car 或者car的父类 (下限)
    public   static   void play(ArrayList<? super  car> list){

    }



    //泛型没有多态 , 没有重载
//    public  static  void play(ArrayList<Car> list){
//
//    }
}


请添加图片描述


请添加图片描述


九、泛型的注意

                * 泛型没有多态,没有重载
                
                * 泛型只能接受"引用类型"

作者:KJ.JK

文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习

相关文章:

  • java毕业设计论坛管理系统mybatis+源码+调试部署+系统+数据库+lw
  • k8s对接ceph,ceph-csi方式
  • Kubernetes控制平面组件:Kubelet
  • 忘记背后,努力面前【开学季flag】
  • 2022-09-04 瞒春 学习笔记
  • 谷歌?亲斤手不推荐 选它就对了
  • Ubuntu20.04下载opencv3.4--未完善
  • (待修改)PyG安装步骤
  • vue2中vant适配-把px都换算成rem
  • 猿创征文|Spring5梦开始的地方:入门必看
  • [中秋特别定制版本]绝美登录页面搭配[登录数据存储到服务器](服务器宝塔数据库开通+短信服务开通+后端redis验证码缓存)
  • 【笔记】文献阅读[YOLOV1]-You_only_look_once_Unified_real-time_object_detection
  • 基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)
  • leetcode 83. Remove Duplicates from Sorted List 删除排序链表中的重复元素(简单)
  • Java环境安装配置步骤介绍
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android单元测试 - 几个重要问题
  • ES2017异步函数现已正式可用
  • express.js的介绍及使用
  • Golang-长连接-状态推送
  • iOS 颜色设置看我就够了
  • java小心机(3)| 浅析finalize()
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Octave 入门
  • passportjs 源码分析
  • quasar-framework cnodejs社区
  • rabbitmq延迟消息示例
  • Redis在Web项目中的应用与实践
  • SQLServer插入数据
  • webpack+react项目初体验——记录我的webpack环境配置
  • 记一次删除Git记录中的大文件的过程
  • 精彩代码 vue.js
  • 力扣(LeetCode)21
  • 面试总结JavaScript篇
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端技术周刊 2019-01-14:客户端存储
  • 世界上最简单的无等待算法(getAndIncrement)
  • 算法之不定期更新(一)(2018-04-12)
  • 小程序01:wepy框架整合iview webapp UI
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 怎么把视频里的音乐提取出来
  • 7行Python代码的人脸识别
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​什么是bug?bug的源头在哪里?
  • #### go map 底层结构 ####
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (175)FPGA门控时钟技术
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (超详细)语音信号处理之特征提取
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot宠物医疗服务网站 毕业设计688413