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

泛型的详解

泛型:就是适用于很多类型

一、引出泛型

        不使用泛型

class MyArray{

    private Object[] arrays = new Object[10];
    //实现两个功能
    public void setValue(int pos,Object value){
        arrays[pos] = value;
    }
    public Object getValue(int pos){
        return arrays[pos];
    }
}
public class Main0928_1 {

    public static void main(String[] args){
        MyArray myArray = new MyArray();
        myArray.setValue(0,4);
        myArray.setValue(1,"hello");
        myArray.setValue(2,2.6);
        myArray.setValue(3,new Object());

        System.out.println(myArray.getValue(0));
        System.out.println(myArray.getValue(1));
        System.out.println(myArray.getValue(2));
        System.out.println(myArray.getValue(3));

    }
}

    使用泛型之后 

class MyArray01<T>{

    private T[] arrays = (T[])new Object[10];
    //实现两个功能
    public void setValue(int pos,T value){
        arrays[pos] = value;
    }
    public T getValue(int pos){
        return arrays[pos];
    }
}
public class Main0928_2 {
    public static void main(String[] args) {
        //泛型的目的是在编译阶段,让编译器去给我们做检查
        MyArray01<Integer> myArray = new MyArray01<>();
        myArray.setValue(0,1);
    }
}

 代码解释 :

    1、泛型的目的是在编译阶段,让编译器去给我们做检查

    2、类名后的<T>代表占位符,表示当前类是一个泛型类

    3、不能new泛型类型的数组

二、泛型的上界

       在定义泛型时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束

class 泛型类名称 <类型形参 extends 类型边界>{
......
}

  例如: 

public class MyArray<E extends Number>{
......
}

   即只接受Number的子类作为E的类型实参

  复杂实例:

public class Calculator<E extends Comparable<E>>{
    public E findMax(E[] arr){
        E max = arr[0];
        if(arr.length == 0){
            throw new RuntimeException("数据为空");
        }
        for(int i = 1;i < arr.length;i++){
            if(max.compareTo(arr[i]) < 0){
                max = arr[i];
            }
        }
        return max;
    }
    public int findMax(int[] arr){
        int max = arr[0];
        if(arr.length == 0){
            throw new RuntimeException("数据为空");
        }
        for(int i = 1;i < arr.length;i++){
            if(max < arr[i]){
                max = arr[i];
            }
        }
        return max;
    }
}

   即E是必须实现了 Comparable 接口的

三、泛型方法

      1、定义语法

方法限定符 <类型形参列表>  返回值类型 方法名称 (形参列表) {...

     2、示例

class Calculator1{
    //泛型方法的定义
    public <E extends Comparable<E>> E findMax(E[] arr){
        E max = arr[0];
        if(arr.length == 0){
            throw new RuntimeException("数据为空");
        }
        for(int i = 1;i < arr.length;i++){
            if(max.compareTo(arr[i]) < 0){
                max = arr[i];
            }
        }
        return max;
    }
    public static <E extends Comparable<E>> E findMax1(E[] arr){
        E max = arr[0];
        if(arr.length == 0){
            throw new RuntimeException("数据为空");
        }
        for(int i = 1;i < arr.length;i++){
            if(max.compareTo(arr[i]) < 0){
                max = arr[i];
            }
        }
        return max;
    }
}

四、通配符

?用于在泛型的使用,即为通配符 

      当可以接收所有的泛型类型,但是又不能够让用户随意修改,这种情况下就需要使用通配符“?”来处理

    1、通配符上界

<? extends 上界>

<? extends Number>//可以传入的实参类型是Number或者Number的子类

注:通配符的上界,不能进行写入数据,只能读取数据,因为此时存储的元素应该是哪个子类无法确定

    2、通配符下界

<? super 下界>

<? super Integer>//可以传入的实参类型是Integer或者Integer的父类

注:通配符的下界,不能进行读取数据,只能写入数据

五、包装类

       在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型

   1、基本数据类型和对应的包装类

基本数据类型包装类型
bytejava.lang.Byte
shortjava.lang.Short
intjava.lang.Integer
longjava.lang.Long
floatjava.lang.Float
doublejava.lang.Double
booleanjava.lang.Boolean
charjava.lang.Character

 除了Integer和Character,其余基本类型的包装类都是首字母大写

    2、装箱和拆箱

public class Main0929_2 {
    public static void main(String[] args) {
        //Integer里面有缓存机制,范围是-128到127
        Integer a1 = 127;
        Integer a2 = 127;

        Integer b1 = 128;
        Integer b2 = 128;
        System.out.println(a1 == a2);//true,a1和a2是同一个对象
        System.out.println(b1 == b2);//false,b1和b2不是同一个对象

        Integer aa = new Integer(127);
        System.out.println(a1 == aa);//false,aa和a1不是同一个对象

    }
    public static void main1(String[] args) {
        //自动装箱,默认自动调用Integer.valueOf(),返回一个Integer对象
        Integer a = 1;

        //自动拆箱,默认自动调用Integer.intValue(),返回一个int类型的数据
        Integer b = new Integer(1);
        int b1 = b;
        System.out.println(a);
        System.out.println(b);
        System.out.println(b1);
    }
}

 

 

相关文章:

  • 数据填报系统可有效解决业务部门哪些问题?_光点科技
  • 【Web基础】FilterListener
  • 【数模】数模入门与常用算法汇总
  • 【深度学习100例】—— 使用pytorch实现LSTM自动AI作诗(藏头诗和首句续写)| 第6例
  • Linux的开发工具
  • Cadence Allegro Vertex功能介绍使用方法Vertex与Slide的区别图文教程
  • Qt5开发从入门到精通——第九篇六节( Qt5 文件及磁盘处理—— 监视文件和目录变化)
  • 接收节点无线广播发送的数据,并printf打印出来(含核心代码)_物联网挑战赛第四届第一题
  • 【CSDN:国庆活动】——“问答”里的成长记录
  • WEB安全之DIV CSS基础(四):三种定位和堆叠顺序
  • C++ -------- 类型转换
  • 【youcans 的图像处理学习课】11. 形态学图像处理(中)
  • 大二数据库实验-MySQL语句(Employee、Department、Salary)
  • 实验3 数据文件操作和异常处理
  • 【微信小程序】button和image组件的基本使用
  • 【391天】每日项目总结系列128(2018.03.03)
  • CSS 提示工具(Tooltip)
  • Django 博客开发教程 8 - 博客文章详情页
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • IDEA 插件开发入门教程
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SQLServer之创建显式事务
  • Vue 动态创建 component
  • windows下如何用phpstorm同步测试服务器
  • 创建一个Struts2项目maven 方式
  • 数据科学 第 3 章 11 字符串处理
  • 我看到的前端
  • 线上 python http server profile 实践
  • 译有关态射的一切
  • 正则学习笔记
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #{}和${}的区别?
  • #13 yum、编译安装与sed命令的使用
  • #Java第九次作业--输入输出流和文件操作
  • #pragma 指令
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (13):Silverlight 2 数据与通信之WebRequest
  • (python)数据结构---字典
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (安卓)跳转应用市场APP详情页的方式
  • (分布式缓存)Redis分片集群
  • (九十四)函数和二维数组
  • (算法)Travel Information Center
  • (学习日记)2024.01.09
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)程序员技术练级攻略
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • **python多态
  • ./configure,make,make install的作用
  • .cn根服务器被攻击之后
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core控制台应用程序初识