“泛型”这个术语的意思就是:“使用与许多许多的类型”。泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力。如何做到这一点呢,正是通过解耦类或方法与所使用的类型之间的约束。
在你创建参数化类型的一个实例时,编译器会为你负责转型操作并保证类型的正确性。看一个例子:
public class Cat<T> { private T str; public Cat() { } public Cat(T str) { this.str = str; } public T getstr() { return str; } public static void main(String[] args) { Cat<String> name = new Cat<String>("corn"); Cat<Integer> age = new Cat<Integer>(712); System.out.println("name class:" + name.getClass()); System.out.println("age class:" + age.getClass()); System.out.println(name.getClass() == age.getClass()); } } /* output: name class:class com.ys.Cat age class:class com.ys.Cat true */
在使用泛型类时,虽然传入了不同的泛型实参,但并没有真正意义上生成不同的类型,传入不同泛型实参的泛型类在内存上只有一个,即还是原来的最基本的类型(本实例中为Cat),当然,在逻辑上我们可以理解成多个不同的泛型类型。
在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息输出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。
对此总结成一句话:泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型。
好处就是我们不必一开始就指定具体的类型而在使用时再用实际的类型替换此类型的参数,这大大增加了代码的复用性。