什么是泛型

在讲解什么是泛型之前,我们先观察Java标准库提供的ArrayList,它可以看作“可变长度”的数组,因为用起来比数组更方便。 实际上ArrayList内部就是一个Object数组,配合存储一个当前分配的长度,就可以充当“可变数组”: public class ArrayList { private Object array; private int size; public void a
什么是泛型

使用泛型

使用ArrayList时,如果不定义泛型类型时,泛型类型实际上就是Object: // 编译器警告: List list = new ArrayList(); list.add("Hello"); list.add("World"); String first = (String) list.get(0); String second = (String) list.get(1); 此时,只能把&
使用泛型

编写泛型

编写泛型类比普通类要复杂。通常来说,泛型类一般用在集合类中,例如ArrayList<T>,我们很少需要编写泛型类。 如果我们确实需要编写一个泛型类,那么,应该如何编写它? 可以按照以下步骤来编写一个泛型类。 首先,按照某种类型,例如:String,来编写类: public class Pair { private String first; private String last; p
编写泛型

擦拭法

泛型是一种类似”模板代码“的技术,不同语言的泛型实现方式不一定相同。 Java语言的泛型实现方式是擦拭法(Type Erasure)。 所谓擦拭法是指,虚拟机对泛型其实一无所知,所有的工作都是编译器做的。 例如,我们编写了一个泛型类Pair<T>,这是编译器看到的代码: public class Pair<T> { private T first; private T la
擦拭法

extends通配符

我们前面已经讲到了泛型的继承关系:Pair<Integer>不是Pair<Number>的子类。 假设我们定义了Pair<T>: public class Pair<T> { ... } 然后,我们又针对Pair<Number>类型写了一个静态方法,它接收的参数类型是Pair<Number>: public class Pai
extends通配符

super通配符

我们前面已经讲到了泛型的继承关系:Pair<Integer>不是Pair<Number>的子类。 考察下面的set方法: void set(Pair<Integer> p, Integer first, Integer last) { p.setFirst(first); p.setLast(last); } 传入Pair<Integer>是允许的,
super通配符

泛型和反射

Java的部分反射API也是泛型。例如:Class<T>就是泛型: // compile warning: Class clazz = String.class; String str = (String) clazz.newInstance(); // no warning: Class<String> clazz = String.class; String str =
泛型和反射