概念:
泛型本质上是提供类型的"类型参数",它们也被称为参数化类型(parameterized type)或参量多态(parametric polymorphism)。
作用:
1>类型安全。使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。如果没有泛型,那么类型的安全性主要由程序员来把握,这显然不如带有泛型的程序安全性高。
2>消除强制类型转换。泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。
3>向后兼容。支持泛型的 Java 编译器(例如 JDK5.0 中的 Javac)可以用来编译经过泛型扩充的 Java 程序(GJ 程序),但是现有的没有使用泛型扩充的 Java 程序仍然可以用这些编译器来编译。
4>层次清晰,恪守规范。无论被编译的源程序是否使用泛型扩充,编译生成的字节码均可被虚拟机接受并执行。也就是说不管编译器的输入是 GJ 程序,还是一般的 Java 程序,经过编译后的字节码都严格遵循《 Java 虚拟机规范》中对字节码的要求。可见,泛型主要是在编译器层面实现的,它对于Java 虚拟机是透明的。
5>性能收益。目前来讲,用 GJ 编写的代码和一般的 Java 代码在效率上是非常接近的。 但是由于泛型会给 Java 编译器和虚拟机带来更多的类型信息,因此利用这些信息对 Java 程序做进一步优化将成为可能。
泛型的运作过程:GJ(Generic Java)是对 Java 语言的一种扩展,是一种带有参数化类型的 Java 语言。用 GJ 编写的程序看起来和普通的 Java 程序基本相同,只不过多了一些参数化的类型同时少了一些类型转换。实际上,这些 GJ 程序也是首先被转化成一般的不带泛型的 Java 程序后再进行处理的,编译器自动完成了从 Generic Java 到普通 Java 的翻译。
编程用的到的例子:
通配符
1 self-bounded types
curiously recurring generics
父类使用泛型做成模板,然后对于不同的应用
使用派生出来的类。然后填充参数,取出值什么的都用这个子类。注重模板功能
self-bounded
这个迫使使用这个泛型的类为其子类。
2 对于参数化的接口,使用时需要注意这种情况
public interface A<T>{}
public class B implents A<Integer>{
}
这么做是不行的,编辑器会认为 c 实现了两个接口,因了擦洗(erasure),或者也可以这么理解,C继承了B 把 integer 也继承过来了。你再换个double 编辑器不认的。
public class C extends B implentA<Double>{
}
这时你如果写成这样
public class C extends B implent A{
}
编辑器是认的。
或者这样
public class C extends B implentA<Integer>{
}
也是行的。
或者这样
public class C extends B{
}
这也是行的。