欢迎来到天天文库
浏览记录
ID:31000713
大小:79.00 KB
页数:3页
时间:2019-01-05
《【深入java虚拟机(6)】:java语法糖-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、【深入Java虚拟机(6)】:Java语法糖-编程开发技术【深入Java虚拟机(6)]:Java语法糖原文出处:兰亭风雨语法糖(Syntactic?Sugar),也称糖衣语法,是由英国计算机学家Peter.J.Landin发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没冇影响,但是更方便程序员使用。Java+最常用的语法糖主要有泛型、变长参数、条件编译、自动拆装箱、内部类等。虚拟机并不支持这些语法,它们在编译阶段就被还原冋了简单的基础语法结构,这个过程成为解语法糖。泛型是JDK1.5Z后
2、引入的一项新特性,Java语言在还没有出现泛型时,只能通过Object是所有类型的父类和类型强制转换这两个特点的配合来实现泛型的功能,这样实现的泛型功能要在程序运行期才能知道Object真止的对象类型,在Javac编译期,编译器无法检查这个Object的强制转型是否成功,这便将一些风险转接到了程序运行期中。〕3腹语言在JDK1.5Z后引入的泛型实际上只在程序源码中存在,在编译后的字节码文件屮,就已经被替换为了原来的原生类型,并冃在相应的地方插入了强制转型代码,因此对于运彳亍期的Java语言来说,ArrayLis
3、t和ArrayList就是同一个类。所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方法称为类型擦除,基于这种方法实现的泛型被称为伪泛型。下而是一段简单的Java泛型代码:Mapmap二newHashMap();map.put(1,"No.1〃);map.put(2,"No.2〃);Systcm.out・printin(map・gct(l));System.out.printin(map・ge
4、t(2));将这段Java代码编译成Class文件,然后再用字节码反编译工具进行反编译后,将会发现泛型都变回了原生类型,如下面的代码所示:Mapmap二newHashMap();map.put(1,"No.1〃);map.put(2,"No.2〃);System,out.printin((String)map.get(1));System,out.println((String)map.get(2));为了更详细地说明类型擦除,再看如下代码:importjava.util.List;publicclassFan
5、xingTest{publicvoidmethod(Listlist){System,out.println("ListStringz,);}publicvoidmethod(Listlist){System,out・printin("ListInt〃);}}当我用Jewac编译器编译这段代码时,报出了如下错误:FanxingTest.java:3:?名称冲突:method(java,util.List6、List)?具有相同疑符????????public?void?method(List?list){????????????????????八FanxingTest.java:6:?名称冲突:method(java・uti1.List)?和?method(java.util.List)?具有相同疑符????????public?void?method(List?lis7、t){????????????????????八2?错谋这是因为泛型List和List编译后都被擦除了,变成了一样的原生类型List,擦除动作导致这两个方法的特征签名变得一模一样,在Class类文件结构一文屮讲过,Class文件屮不能存在特征签名相同的方法。把以上代码修改如下:importjava.util.List;publicclassFanxingTest{publicintmethod(Listlist){System,out.println(z,Lis8、tStringz,);return1;}publicbooleanmethoc!(List〈lnteger>list){System.out.println("ListInt〃);returntrue;发现这时编译可以通过了(注意:Java语言中true和1没有关联,二者属于不同的类型,不能相互转换,不存在C语言屮整数值•非零即真的情况)。两个不同类型的返回值的加入,使得方法的重载成功
6、List)?具有相同疑符????????public?void?method(List?list){????????????????????八FanxingTest.java:6:?名称冲突:method(java・uti1.List)?和?method(java.util.List)?具有相同疑符????????public?void?method(List?lis
7、t){????????????????????八2?错谋这是因为泛型List和List编译后都被擦除了,变成了一样的原生类型List,擦除动作导致这两个方法的特征签名变得一模一样,在Class类文件结构一文屮讲过,Class文件屮不能存在特征签名相同的方法。把以上代码修改如下:importjava.util.List;publicclassFanxingTest{publicintmethod(Listlist){System,out.println(z,Lis
8、tStringz,);return1;}publicbooleanmethoc!(List〈lnteger>list){System.out.println("ListInt〃);returntrue;发现这时编译可以通过了(注意:Java语言中true和1没有关联,二者属于不同的类型,不能相互转换,不存在C语言屮整数值•非零即真的情况)。两个不同类型的返回值的加入,使得方法的重载成功
此文档下载收益归作者所有