永远不要跟别人比幸运,我从来没想过我比别人幸运,我也许比他们更有毅力,在最困难的时候,他们熬不住了,我可以多熬一秒钟、两秒钟,甚至更久。

Java 中的语法糖之泛型与类型擦除

Java 新民 209℃ 已收录 0评论

说到类型擦除,就不得不了解一下语法糖了,首先来看看什么是语法糖

语法糖(Syntactic Sugar)也称为糖衣语法,是由英国计算机科学家彼得.约翰.兰达发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来讲能够增加程序的可读性、从而减少程序的出错几率。Java 在现代编程语言中属于“低糖语言”。好了,现在终于知道什么是语法糖了,下面来介绍Java中的泛型与类型擦除。

泛型是JDK1.5的新特性,他的本质是参数化类型的应用,也就是说所操做的类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中。分别被成为泛型类、泛型接口和泛型方法。

泛型思想早起在C++的模板中就开始生根发芽,在Java语言还没有出现泛型时,只能通过Object是所有类型的父类和强制转换两个特点的配合来实现泛型化。例如在哈希表的存取中,JDK1.5之前HashMap 的get() 方法,返回值就是一个Object对象,由于在Java中所有的类都继承于java.lang.Object , 那么Object转换成任何对象都是有可能的。但也是因为有无限的可能性,就只有程序员和运行期的虚拟机才知道这个Object到底是什么类型的对象,在编译期间,编译器无法检查这个Object强制转换是否成功,如果仅仅依靠程序员去保证这个操作的正确性,许多ClassCastException的风险就会被转嫁到程序的运行期中。

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

如下代码是个简单的泛型例子,代码如下:

 

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("hello", "您好");
		map.put("name", "张三");
		System.out.println(map.get("hello"));
		System.out.println(map.get("name"));
	}

把这段代码编译成class文件后,然后再用字节码反编译工具进行反编译后,将会发现泛型都不见了,程序又变回了Java泛型出现之前的写法,泛型类都变回了原生类型。如下例子是反编译后的代码:

	public static void main(String[] args) {
		Map map = new HashMap();
		map.put("hello", "您好");
		map.put("name", "张三");
		System.out.println((String)map.get("hello"));
		System.out.println((String)map.get("name"));
	}

由此可见,泛型是被擦除掉了。至此,Java中的泛型与类型擦除就介绍到这里了。

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:http://www.snowruin.com/?p=1748
喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址