Java 语法糖 泛型、自动拆装箱、遍历循环等

本文介绍了Java泛型的概念及其实现原理,解释了类型擦除的过程,并探讨了自动装箱、拆箱等语法糖特性。此外,还展示了泛型类中获取参数化类型的途径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、泛型与类型擦除

泛型是JDK 1.5的一项新增特性,它的本质是参数化类型(Parametersized Type)的应
用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法
的创建中,分别称为泛型类、泛型接口和泛型方法。
Java语言中的泛型则:它只在程序源码中存在,在编译后的字节码文件中,就已
经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转
型代码,因此,对于运行期的Java语言来说,ArrayListint>与ArrayListString>就是同一
个类,所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型
擦除,基于这种方法实现的泛型称为伪泛型。
由于Java泛型的引入,各种场景(虚拟机解析、反射等)下的方法调用都可能对原有的
基础产生影响和新的需求,如在泛型类中如何获取传入的参数化类型等。因此,JCP组织对
虚拟机规范做出了相应的修改,引入了诸如SignatureLocalVariableTypeTable等新的属性用
于解决伴随泛型而来的参数类型的识别问题,Signature是其中最重要的一项属性,它的作用
就是存储一个方法在字节码层面的特征签名,这个属性中保存的参数类型并不是原生类型,而是包括了参数化类型的信息。修改后的虚拟机规范要求所有能识别49.0以上版本的Class文件的虚拟机都要能正确地识别Signature参数。
另外,从Signature属性的出现我们还可以得出结论,擦除法所谓的擦除,仅仅是对方法
Code属性中的字节码进行擦除,实际上元数据中还是保留了泛型信息,这也是我们能通过
反射手段取得参数化类型的根本依据。

二、自动拆、装箱、循环遍历

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4);
        int sum = 0;
        for (int i : list){
            sum += i;
        }
        System.out.println(sum);

    }

   public static void main(String[] args) {

        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 128;
        Integer f = 128;
        Long g = 3L;
        System.out.println(c == d); //有缓存 有符号八位所以范围是 -128 到 127
        System.out.println(e == f); // 128 在缓存外所以比较的是地址
        System.out.println(c == (a + b)); // 通过运算才会自动拆箱  比较的是值
        System.out.println(c.equals(a + b)); // equals比较的是值
        System.out.println(g == (a + b));  // 自动拆箱和自动转换类型
        System.out.println(g.equals(a + b));  // equals 能拆箱不能转换类型

    }

除了本节中介绍的泛型、自动装箱、自动拆箱、遍历循环、变长参数和条件编译之
外,Java语言还有不少其他的语法糖,如内部类、枚举类、断言语句、对枚举和字符串(在
JDK 1.7中支持)的switch支持、try语句中定义和关闭资源(在JDK 1.7中支持)等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值