Java泛型机制实际是一个安全机制。个人觉得泛型因其灵活性可以结合许多东西,编写出更加简便,通用的程序。本篇文章只是介绍下基本的用法,更多巧妙的组合还在于开发者的灵活运用。
泛型的好处最明显一点就是不用我们再进行强制类型转换了,暗处的好处就是Java帮助我们进行了类型检测,这才是最重要的一个好处。
下面通过一个示例介绍下泛型编写出的代码是如何的通用。现在需要打印List<String>,List<Integer>这两个集合,如果不使用泛型的话,需要为每一个集合都写一个输出方法。如果我想打印50个不同类型的LIst呢?难道需要写50个输出方法吗?如果使用泛型的话,只需一个方法就可以搞定。
static <T> void printList(List<T> list) {
Iterator<T> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
或者这样:
static void printList(List<?> list) {
Iterator<?> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
甚至夸张一些可以这样:
static void printList(Collection<?> collection) {
Iterator<?> it = collection.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
这个连Set集合也可以打印了。
有人会想着这样写:
static void printList(List<Object> list) {
Iterator<Object> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
很遗憾这么写是完全行不通的,是错误的。这也是在使用泛型非常需要注意的一点。List<Object>是不能接受List<String>,List<Integer>这些参数的。
泛型还有一种比较强大的应用方式。自定义一个People类和一个Student类,Student是People类的子类。现在有一个方法,只想接受People类以及其子类,其他的类型拒绝接受,如何写呢?
static void doSomething(List<? extends People> peoples) {
Iterator<? extends People> it=peoples.iterator();
while (it.hasNext()) {
// do some People special method
People p=it.next();
//p.X();
}
}
这也叫泛型的上限,当然还有下限。即:<? super People>,只能接受People及其父类。
泛型的使用十分的灵活,我只是新手入门,只是体会到了部分的好处,更多泛型的使用还需自己体会,思考。