Java 语法糖.pdf
文本预览下载声明
Java 语法糖
Java 语法糖
语法糖 (Syntactic Sugar ),也称糖⾐语法,是由英国计算机学家 Peter .J .Landin 发明
的⼀个术语,指在计算机语⾔中添加的某 语法,这 语法对语⾔的功能并没有影
响,但是更⽅便程序员使⽤。Java 中最常⽤的语法糖主要有泛型、变长参数、条件编
译、⾃动拆装箱、内部类等。虚拟机并不⽀持这些语法,它们在编译阶段就被还原回
了简单的基础语法结构,这个过程成为解语法糖。
泛型是 JDK 1.5 之后引⼊的⼀项新特性,Java 语⾔在还没有出现泛型时,只能通过
Object 是所有类型的⽗类和类型强制转换这两个特点的配合来实现泛型的功能,这样
实现的泛型功能要在程序运⾏期才能知道 Object 真正的对象类型,在 j avac 编译期,
编译器⽆法检查这个 Object 的强制转型是否成功,这便将⼀些风险转接到了程序运⾏
期中。
Java 语⾔在 JDK 1.5 之后引⼊的泛型实际上只在程序源码中存在,在编译后的字节码
⽂件中,就已经被替换为了原来的原⽣类型,并且在相应的地⽅插⼊了强制转型代
码,因此对于运⾏期的Java语⾔来说,ArrayList和 ArrayList就是同⼀个类。所以泛型
技术实际上是 Java 语⾔的⼀颗语法糖,Java 语⾔中的泛型实现⽅法称为类型擦除,基
于这 ⽅法实现的泛型被称为伪泛型。
下⾯是⼀段简单的 Java 泛型代码:
MapInteger,String map = new HashMapInteger,String();
map.put(1,No.1);
map.put(2,No.2);
S stem.out.println(map.get(1));
S stem.out.println(map.get(2));
将这段 Java 代码编译成 Class ⽂件,然后再⽤字节码反编译⼯具进⾏反编译后,将会
发现泛型都变回了原⽣类型,如下⾯的代码所⽰:
Map map = new HashMap();
map.put(1,No.1);
map.put(2,No.2);
S stem.out.println((String)map.get(1));
S stem.out.println((String)map.get(2));
为了更详细地说明类型擦除,再看如下代码:
import java.util.List;
public class FanxingTest{
public void method(ListString list){
S stem.out.println(List String);
}
public void method(ListInteger list){
S stem.out.println(List Int);
}
}
当⽤ j avac 编译器编译这段代码时,报出了如下错误:
FanxingTest.java:3: 名称冲突:method(java.util.Listjava.lang.Strin
(java.util.Listjava.lang.Integer) 具有相同疑符
public void method(ListString list){
^
FanxingTest.java:6: 名称冲突:method(java.util.Listjava.lang.Integ
d(java.util.Listjava.lang.String) 具有相同疑符
public void method(ListInteger list){
^
2 错误
是因为泛型 List 和 List 编译后都被擦除了,变成了⼀样的原⽣类型 List ,擦除动作导
致这两个⽅法的特征签名变得⼀模⼀样,在 Class 类⽂件结构⼀⽂中讲过,Class ⽂件
中不能存在特征签名相同的⽅法。
把以上代码修改如下:
import java.util.List;
public class FanxingTest{
public int method(ListString list){
S stem.out.prin
显示全部