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


    目录

    1.泛型

    1.1泛型概述

    1.2泛型的好处

    1.3泛型类

    1.4泛型方法

    1.5泛型接口

    1.6类型通配符

    1.7可变参数

    1.8可变参数的使用


    1.泛型

    1.1泛型概述

    泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
    一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
    顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型

    这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口

    泛型定义格式:
    <类型>:指定一种类型的格式。这里的类型可以看成是形参
    <类型1类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参

    将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型

    1.2泛型的好处

    把运行时期的问题提前到了编译期间

    避免了强制类型

    1.3泛型类

    泛型类的定义格式:
    格式:修饰符class类名<类型>{}范例:publicclassGeneric{}
    此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

    • ? 表示不确定的 java 类型
    • T (type) 表示具体的一个java类型
    • K V (key value)分别代表java键值中的Key Value
    • E (element) 代表Element

    1.4泛型方法

    泛型类,是在实例化类的时候指明泛型的具体类型;

    泛型方法,是在调用方法的时候指明泛型的具体类型 。

    1)public 与 返回值中间非常重要,可以理解为声明此方法为泛型方法。
    2)只有声明了的方法才是泛型方法,泛型类中的使用了泛型的成员方法并不是泛型方法。
    3)表明该方法将使用泛型类型T,此时才可以在方法中使用泛型类型T。
    4)与泛型类的定义一样,此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型。

    1. /*
    2. 这是泛型方法。
    3. 首先在public与返回值之间的必不可少,这表明这是一个泛型方法,并且声明了一个泛型T
    4. 这个T可以出现在这个泛型方法的任意位置.
    5. 泛型的数量也可以为任意多个
    6. */
    7. 如:public K showKeyName(Generic container){
    8. ...
    9. }
    10. public class GenericTest {
    11. //这个类是个泛型类,在上面已经介绍过
    12. //虽然在方法中使用了泛型,但是这并不是一个泛型方法
    13. public class Generic{
    14. private T key;
    15. public Generic(T key) {
    16. this.key = key;
    17. }

    1.5泛型接口

    泛型接口定义格式:

    格式:修饰符interface接口名<类型>{}

    范例:publiic interface Generic{}

    泛型接口定义:

    1. package zyy02;
    2. public interface Generic {
    3. void show(T t);
    4. }

    实现类:

    1. package zyy02;
    2. public class GenericImpl implements Generic{
    3. @Override
    4. public void show(T t) {
    5. System.out.println(t);
    6. }
    7. }

    测试:

    1. package zyy02;
    2. public class Demo {
    3. public static void main(String[] args) {
    4. Generic g=new GenericImpl<>();
    5. g.show("zyy");
    6. Generic g1=new GenericImpl<>();
    7. g1.show(14);
    8. }
    9. }

    1.6类型通配符

    为了表示各种泛型List的父类,可以使用类型通配符
            类型通配符:
            List:表示元素类型未知的List,它的元素可以匹配任何的类型
            这种带通配符的List仅表示它是各种泛型List的父类,并不能把元素添加到其中

    如果说我们不希望List是任何泛型List的父类,只希望它代表某一类泛型List的父类,可以使用类型通配简的上限
            类型通配符上限:
            List:它表示的类型是Number或者其子类型

    除了可以指定类型通配符的上限,我们也可以指定类型通配符的下限
            类型通配符下限:
            List:它表示的类型是Number或者其父类型

    1. package zyy02;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Demo {
    5. public static void main(String[] args) {
    6. //类型通配符
    7. List l1=new ArrayList();
    8. List l2=new ArrayList();
    9. List l3=new ArrayList();
    10. System.out.println("***************");
    11. //上限
    12. Listextends Number > l4=new ArrayList();
    13. Listextends Number> l5=new ArrayList();
    14. //List l6=new ArrayList();
    15. //下限
    16. Listsuper Number > l7=new ArrayList();
    17. Listsuper Number > l8=new ArrayList();
    18. //List l9=new ArrayList();
    19. }
    20. }
    21. 1.7可变参数

      可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
              格式:修饰符 返回值类型 方法名(数据类型….变量名){}

              范例:public static int sum(int….a){}

      可变参数注意事项:

              这里的变量其实是一个数组

              如果一个人方法有多个参数,包含可变参数,可变参数要放在最后

      1. package zyy02;
      2. public class Demo {
      3. public static void main(String[] args) {
      4. System.out.println(sum(1,2,4));
      5. System.out.println(sum(8,2,8));
      6. }
      7. public static int sum(int... a){
      8. int sum=0;
      9. for(int i:a){
      10. sum+=i;
      11. }
      12. return sum;
      13. }
      14. }

      1.8可变参数的使用

      Arrays工具类中有一个静态方法:
              public static ListasList(T…a):返回由指定数组支持的固定大小的列表

      List接口中有一个静态方法:
              publicstaticListof(E…elements):返回包含任意数量元素的不可变列表

      Set接口中有一个静态方法:
              public static SetofE.…elements):一个包含任意数量元素的不可变集合

    22. 相关阅读:
      网页版五子棋实时对战系统
      Kafka 架构
      初识Docker
      HTML网页设计——轮滑运动体育类人物介绍主题12页面毕业设计网页
      vant组件是使用?
      DNS域名解析过程
      java集成WebSocket
      自编码器(Autoencoder)基本原理与模型实现
      SQL server中创建了表,却查不到
      Python 比较出2个list中相同的内容,忽略大小写
    23. 原文地址:https://blog.csdn.net/qq_62799214/article/details/126189441
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | 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号