码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java泛型


    一、泛型引入
    1、引入:
        1、在使用集合时,不能对加入到集合中的元素类型进行约束,因为集合里面的元素类型为Object。
        2、遍历集合时,需要进行类型转化,如果数据量比较大,那么对效率有影响。
    2、说明:
    1. 泛(广泛)型又称参数化类型,是JDK5.0出现的新特性,解决数据类型的安全性问题。
    2. 在类声明或实例化时,只需要指定好需要的具体类型即可。
    3. 可以在类声明时通过一个标识来表示类中某个属性的类型,或者某个方法的返回值类型,或者参数类型。
    泛型的声明:
        interface接口{}
        class类{}
         <>内的字母没有限制,且实例化时,只能为引用类型,不能是基本数据类型。
        一般:
    • E  - Element (在集合中使用,因为集合中存放的是元素)
    • T  - Type(Java 类)
    • K  - Key(键)
    • V  - Value(值)
    • N  - Number(数值类型)
    • ?  - 表示不确定的 java 类型
        比如:接口List和类HashMap
            
            
    例如:
        Test为一个泛型类,在类声明中出现,在类中就可以使用。
        然后Show()方法为一个泛型方法
        
    •    注意,在定义Test类对象stringTest时制定了E的数据类型,在编译期间,就确定了E的类型。
        
    基本原理:
        泛型本质是将数据类型参数化,它通过擦除的方式来实现。
        声明了泛型的 .java 源代码,在编译生成 .class 文件之后,泛型相关的信息就消失了。
        可以认为,源代码中泛型相关的信息,就是提供给编译器用的。泛型信息对 Java 编译器可以见,对 Java 虚拟机不可见。
    Java 编译器通过如下方式实现擦除:
        用 Object 或者界定类型替代泛型,产生的字节码中只包含了原始的类,接口和方法;
        在恰当的位置插入强制转换代码来确保类型安全;
        在继承了泛型类或接口的类中插入桥接方法来保留多态性。
    详情: Java 中泛型的实现原理 - 博客园
    3、细节
    1.<>内部的T或E等只能是引用类型,不能是基本数据类型。
    2.在指定了泛型的具体类型之后,可以传入该类型或该类型的子类类型。
    3.泛型使用形式:
        ①正常模式:List list = new ArrayListList();
        ② 简化模式,实际开发中使用这种:
            编译器会使用类型推断,可以省略后面<>内部的类型。
            List list = new ArrayListList<>();
        ③List list = new ArrayList();
            这样写,泛型默认为Object。
    二、自定义泛型
    1、自定义泛型类
    语法:
        class 类名{//可以定义多个
        }
    使用细节:
        1.普通成员可以使用泛型(属性、方法)
        2.使用泛型数组,不能初始化。
            因为在new的时候,不知道泛型具体类型,不知道开辟多大的空间。
        3.静态方法中,不能使用类的泛型。
            因为静态方法和类无关,未创建对象(即未指定泛型具体类型)便可以使用。
            所以不指定类型则无法使用,因此静态方法不能使用类的泛型。
        4.泛型类的类型,是在创建对象时确定的(创建对象时,需要指定类型,没有指定则默认为Object)。
    2、自定义泛型接口
    语法:
        interface 接口名{//可以定义多个
        }
    使用细节:
        1.静态成员不能使用泛型。
        2.泛型类型的接口,在继承接口或实现接口时确定,没有指定默认为Object。
    3、自定义泛型方法
    语法:
        修饰符 返回类型 方法名(参数列表){
        }
    细节:
        1.可以定义在普通类中,也可以定义在泛型类中。
        2.方法被调用时,类型就会确定。
        3.public void fun(E e){}
                这是使用了泛型
                不是泛型方法,因为修饰符后面没有泛型列表
    三、例子
    class A {
        public void f(E e){//正确,这是泛型类
            System.out.println(e.getClass().getSimpleName());
        }
        public void h(U u){}//错误,U并未定义
        public void M(M m){}//正确,使用了泛型的方法
    }
    class Dog{}
    psvm(){
        A a = new A<>();
        a.f(10);//自动装箱,输出Integer
        a.f(new Dog);//输出Dog
    }
    四、泛型的继承和通配
    1.泛型不具备继承性
        List list = new ArrayList();
        //这是错误的,虽然String 时Object的子类,但是不能这样写,但可以直接赋值String。
    2.
        支持任意泛型类型
    3.
        支持A类以及A类的子类,规定了泛型的上限。
    4.
        支持A类以及A类的父类,不限于直接父类,规定了泛型的下限。
  • 相关阅读:
    【算法系列篇】分治-归并
    java毕业生设计员工健康检测系统计算机源码+系统+mysql+调试部署+lw
    【实训项目】你好,教练-校园私教平台的设计与开发
    教科书答案
    【蓝桥杯选拔赛真题45】Scratch猫鼠游戏 少儿编程scratch蓝桥杯选拔赛真题讲解
    自适应两阶段Hash Distinct速记
    vue中 字体图标引入 - iconfont阿里字体图标库
    Cloudflare 重定向配置
    阿里云历时13年,站上世界现代计算架构之巅
    【考研】常考的二叉树相关算法总结(详细全面)
  • 原文地址:https://blog.csdn.net/qq_63635872/article/details/139294358
    • 最新文章
    • 攻防演习之三天拿下官网站群
      数据安全治理学习——前期安全规划和安全管理体系建设
      企业安全 | 企业内一次钓鱼演练准备过程
      内网渗透测试 | Kerberos协议及其部分攻击手法
      0day的产生 | 不懂代码的"代码审计"
      安装scrcpy-client模块av模块异常,环境问题解决方案
      leetcode hot100【LeetCode 279. 完全平方数】java实现
      OpenWrt下安装Mosquitto
      AnatoMask论文汇总
      【AI日记】24.11.01 LangChain、openai api和github copilot
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
    正则表达式工具 cron表达式工具 密码生成工具

    京公网安备 11010502049817号