首页 > 编程语言 >Java中的泛型是如何工作的?

Java中的泛型是如何工作的?

时间:2024-03-18 22:29:32浏览次数:20  
标签:Box Java 通配符 如何 参数 类型 泛型 public

Java中的泛型(Generics)是JDK 5.0引入的一个新特性,它提供了编译时类型安全,允许在定义类、接口和方法时使用类型参数(type parameters)。泛型的主要目的是在编译时增强类型检查,以减少运行时类型转换的错误,同时保持使用泛型类型时的类型灵活性。

以下是Java中泛型工作的几个关键点:

  1. 类型参数
    泛型类、接口和方法使用尖括号<>中的类型参数进行定义。例如,ArrayList<E>是一个泛型类,其中E是一个类型参数,代表元素类型。
    public class Box<T> {  
        private T t;  
      
        public void set(T t) {  
            this.t = t;  
        }  
      
        public T get() {  
            return t;  
        }  
    }

    在上面的例子中,Box<T>是一个泛型类,其中T是一个类型参数,可以用来代表任何类型。

  2. 类型推断
    在创建泛型对象或调用泛型方法时,编译器通常可以通过上下文推断出类型参数的具体类型,这称为类型推断。如果编译器无法推断出类型,就需要显式地提供类型参数。
    Box<Integer> integerBox = new Box<>(); // 类型推断为Integer  
    Box<String> stringBox = new Box<String>(); // 显式指定类型参数

  3. 类型擦除
    泛型信息在编译后会被擦除,这称为类型擦除。编译器会将泛型类型转换为原始类型(raw type),并在必要时插入类型转换和类型检查代码。这意味着运行时并没有泛型类型的概念,所有的类型参数都会被替换为它们的边界或者是Object。因此,泛型并不能提供运行时的类型安全,而主要是在编译时提供类型检查。

  4. 泛型限制与边界
    可以通过extends关键字为泛型类型参数设置上界,以确保类型参数只能是某种类型的子类或实现类。

    public class NumberBox<T extends Number> {  
        private T t;  
        // ...  
    }

    在这个例子中,NumberBox的类型参数T必须是Number类或其子类的实例。

  5. 泛型方法与泛型类
    泛型方法不仅可以在泛型类中出现,也可以在普通类中定义。泛型方法使用类型参数来定义返回类型或参数类型。
    public class Util {  
        public static <T> T getFirst(T[] array) {  
            if (array != null && array.length > 0) {  
                return array[0];  
            } else {  
                return null;  
            }  
        }  
    }

    在这个例子中,getFirst是一个泛型方法,它接受一个泛型数组并返回数组的第一个元素。

  6. 通配符
    泛型通配符(?)用于表示未知类型,常用于泛型方法的参数和泛型类的字段中。通配符有三种形式:无界通配符(?)、上界通配符(? extends Type)和下界通配符(? super Type),它们提供了更灵活的类型匹配。

泛型极大地增强了Java的类型系统,使得代码更加清晰、可读和可维护,同时减少了因类型转换导致的运行时错误。然而,由于类型擦除的存在,泛型并不能完全替代传统的对象封装和转换机制。在使用泛型时,还需要注意一些与类型擦除相关的潜在问题,如桥接方法的生成和原始类型的兼容性问题。

标签:Box,Java,通配符,如何,参数,类型,泛型,public
From: https://blog.csdn.net/meishengjie111/article/details/136774878

相关文章

  • 计算机毕业设计-基于Java+SSM架构的学生综合考评管理系统项目开发实战(附论文+源码)
    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 程序人生——Java开发持续进阶,拥抱开源世界以思想为源泉
    目录引出开源世界建议139:大胆采用开源工具建议140:推荐使用Guava扩展工具包建议141:Apache扩展包建议142:推荐使用Joda日期时间扩展包建议143:可以选择多种Collections扩展思想为源建议144:提倡良好的代码风格建议145:不要完全依靠单元测试来发现问题建议146:让注释正确、清......
  • 程序人生——Java使用关于性能和效率的建议
    目录引出性能和效率建议132:提升Java性能的基本方法建议133:若非必要,不要克隆对象建议134:推荐使用“望闻问切”的方式诊断性能建议135:必须定义性能衡量标准建议136:枪打出头鸟—解决首要系统性能问题建议137:调整JVM参数以提升性能建议138:性能是个大“咕咚”深入认识JVM......
  • 史上最全Java核心面试题(带全部答案)2024年最新版
    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦。在跳槽季来临之前,特地做这个系列的文章,一方面帮助自己巩固下基础,另一方面也希望帮助想要换工......
  • 如何突破DRAM对SSD容量提升的限制?
    近日小编看到PureStorage公司的研发高级副总裁肖恩·罗斯马林(ShawnRosemarin)的一个观点“由于DRAM的局限性,固态硬盘(SSD)的容量难以突破30TB”。这个观点不是完全准确,实际上,Solidigm已经发布了最大容量61.44TBQLCSSD。但是,这个观点背后的逻辑依然是业内在提升SSD容......
  • 前端学习-vue视频学习008-TS中的接口\泛型\自定义类型
    尚硅谷视频链接使用ts定义,可限制参数的类型新建ts文件//定义接口限制对象属性exportinterfacepersonInter{name:string,age:number,gender:string}//使用泛型//exporttypepersonArr=Array<personInter>//另一种写法exporttypepersonArr=p......
  • Java 基础语法(2)
    一、流程控制结构1.分支结构if语句if(条件){语句;}elseif(条件){语句;}else{语句;}switch语句switch(变量){case"":语句;break;case"":case"":case"":……语句;break;default:语句;}2.循环结构for循环for(初始化语句......
  • 为 java 开发者设计的性能测试框架,用于压测+测试报告生成
    拓展阅读junit5系列教程基于junit5实现junitperf源码分析Autogeneratemockdataforjavatest.(便于Java测试自动生成对象信息)Junitperformancerelyonjunit5andjdk8+.(java性能测试框架。压测+测试报告生成。)junitperfjunitperf是一款为java开发者设......
  • Java 入门 - 常用的dos命令
    切换盘符盘符名:->回车查看当前路径下的文件或者文件夹dir进入指定文件夹下cd文件夹名字进入到多级文件夹下cd文件夹名字\文件夹名字退到上一级目录cd..或者cd..直接退到磁盘位置(退至根目录)cd\或者cd\清屏cls 退出黑窗口 exit......
  • java软考网络工程师在线练习平台(ssm框架毕业设计)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今信息化社会,网络技术已经渗透到了我们生活和工作的方方面面。随着互联网的普及和发展,网络工程师成为了企业、政府及各类组织不可或缺的重要岗位。为......