Java语法糖

原创
2017/01/14 18:08
阅读数 70

语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家Peter.J.Landin发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。Java中最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。虚拟机并不支持这些语法,它们在编译阶段就被还原回了简单的基础语法结构,这个过程成为解语法糖。 泛型是JDK1.5之后引入的一项新特性,Java语言在还没有出现泛型时,只能通过Object是所有类型的父类和类型强制转换这两个特点的配合来实现泛型的功能,这样实现的泛型功能要在程序运行期才能知道Object真正的对象类型,在Javac编译期,编译器无法检查这个Object的强制转型是否成功,这便将一些风险转接到了程序运行期中。

Java语言在JDK1.5之后引入的泛型实际上只在程序源码中存在,在编译后的字节码文件中,就已经被替换为了原来的原生类型,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList<String>和ArrayList<Integer>就是同一个类。所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。

泛型与类型擦除

下面是一段简单的Java泛型代码:

Map<Integer,String> map = new HashMap<Integer,String>();  
map.put(1,"No.1");  
map.put(2,"No.2");  
System.out.println(map.get(1));  
System.out.println(map.get(2));  

将这段Java代码编译成Class文件,然后再用字节码反编译工具进行反编译后,将会发现泛型都变回了原生类型,如下面的代码所示:

Map map = new HashMap();  
map.put(1,"No.1");  
map.put(2,"No.2");  
System.out.println((String)map.get(1));  
System.out.println((String)map.get(2)); 

参考

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

public static void main(String[] args) {
		List<Integer> list = Arrays.asList(1, 2, 3, 4);
		// 如果是在 JDK 1.7 还有另外一颗语法糖
		// 能让上面这句代码进一步简写成 List<Integer> list = [1,2,3,4];
		int sum = 0;
		for (int i : list) {
			sum += i;
		}
		System.out.print(sum);
	}

自动装箱、拆箱与遍历循环编译之后反编译的代码

public static void main(String[] args) {
    List list = Arrays.asList(new Integer[] { Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3),Integer.valueOf(4) });

    int sum = 0;
    for (Iterator localIterator = list.iterator(); localIterator.hasNext(); ) {
           int i = ((Integer)localIterator.next()).intValue();
          sum += i;
    }
    System.out.print(sum);
  }
展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部