Table of Contents
概述
在博客java重要基础知识汇总中,我们提到了内部类是一种java的语法糖。事实上java除了内部类还提供了另外一些语法糖,用于方便程序员的代码开发。但是值得注意的是,语法糖对代码不会带来任何实质性的功能上的变化。他仅仅是编译器做的一些'把戏'.语法糖在各种编程语言中几乎都存在。
语法糖:泛型与类型擦出
泛型是java5开始支持的一项特性。其本质是参数化类型的应用,也就是说要被用于操作的数据类型可以被指定为一个参数。再次重复,将数据类型作为一个参数即为泛型。这样带来的作用就是对于一些代码我们在定义时无需指定类型,在实际调用时才指定类行即可,带来了更大的灵活性。
在java5之前事实上java语言当中存在一种体现方式强制转换的类泛型,以Hashmap的get方法为例:
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
在java8中的get方法定义如上,然而在泛型没有出现之前,这个方法的返回值就是一个Object对象,因为java语言里面的所有类型都是Object的子类。但是在这里返回类型定义的是V,这就是定义fan
java中的泛型只存在于程序源码当中,在编译后的字节码当中就已经不存在。而替换为原来类型Raw Type了,并且在相应的地方插入强制类型转换代码。这也为什么我们通过反编译看到的代码和我们自己写的代码往往在泛型定义上是不一样的原因。因此,对于处于runtime的JAVA语言来说,ArrayList<int>与ArrayList<String>就是同一个类型。java语言中的泛型实现方法称为类型擦除-type-erasure,基于这种方法实现的泛型称为伪泛型。
下面是一个例子程序:
import java.util.HashMap;
import java.util.Map;
public class TestGeneric {
public static void main(String[] args){
Map<String,String> map = new HashMap<String, String>();
map.put("hello","你好");
map.put("