Java中的泛型代码和C++中的模板有一个很大的不同:C++中模板的实例化会为每一种类型都产生一套不同的代码,这就是所谓的代码膨胀。
Java中并不会产生这个问题。虚拟机中并没有泛型类型对象,所有的对象都是普通类。
虚拟机中的泛型转换需要记住4条事实:
1) 定义任何一个泛型都会自动产生其原始类型(raw type)
2) 这个过程中,泛型类型会被擦除,替换为其限定类型(bounding type)
3) 必要时插入强制转换来保证类型安全
4) 使用桥接方法(bridge method)来保证正确处理多态
例如写一个返回数组中最小值的泛型函数,可以如下定义。
public static <T extends Comparable> T min(T[] a)
类型擦除后,替换为限定类型Comparable,其原始类型就是
public static Comparable min(Comparable[] a)
如果没有限定类型,那么类型擦除后就替换为Object。例如一个Pair<T>类
Java中并不会产生这个问题。虚拟机中并没有泛型类型对象,所有的对象都是普通类。
虚拟机中的泛型转换需要记住4条事实:
1) 定义任何一个泛型都会自动产生其原始类型(raw type)
2) 这个过程中,泛型类型会被擦除,替换为其限定类型(bounding type)
3) 必要时插入强制转换来保证类型安全
4) 使用桥接方法(bridge method)来保证正确处理多态
例如写一个返回数组中最小值的泛型函数,可以如下定义。
public static <T extends Comparable> T min(T[] a)
(实际上Comparable也是一个泛型接口,所以最正确的定义方法是public static <T extends Comparable<? super T>> T min(T[] a) )
类型擦除后,替换为限定类型Comparable,其原始类型就是
public static Comparable min(Comparable[] a)
如果没有限定类型,那么类型擦除后就替换为Object。例如一个Pair<T>类
public class Pair<T> {
private T first;
private T second;
public Pair(T first, T second) {
this.first = first;