泛型是JDK 1.5的一项新特性,它的本质是参数化类型(ParameterizedType)的应用,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。
泛型类:
public class Test<T> {}
泛型接口:
public interface Test<T> {}
泛型方法:
public class Test { public <T extends List> void test(T t){} }
Java 的泛型是通过语法糖来实现的,语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
public class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(); li("hello"); li("world"); for(String s : list) { Sy(s); } } }
通过 javac Te 编译后得到 Te 文件,然后反编译 class 文件后得到如下内容:
public class Test { public Test() { } public static void main(String[] var0) { ArrayList var1 = new ArrayList(); var1.add("hello"); var1.add("world"); Iterator var2 = var1.iterator(); while()) { String var3 = (String(); Sy(var3); } } }
可以看到在源码中的泛型在编译后消失了,编译后的字节码是通过强制转换得到的 String 类型,Java 中有大量的语法糖的应用,例如 switch、装箱与拆箱、枚举、变长参数等等,想要了解内部的秘密可以尝试反编译字节码方式来看到它的真实面貌。