1. 实现泛型的目的
泛型要实现的目标就是在编译的时候就能找出bugs,而不是在运行时才发现错误。在编译的时候就能找出问题能帮助我们节省大量的时间,因为在编译时bugs更容易找出(编译器帮我们找出)也更容易修复。重要的是泛型是属于编译期的概念。
2. 如果没有泛型
class Room {
private Object object;
public void add(Object object) {
this.object = object;
}
public Object get() {
return object;
}
}
public class Main {
public static void main(String[] args) {
Room room = new Room();
room.add("60"); //this will cause a run-time error
Integer i = (Integer)room.get();
System.out.println(i);
}
}
在这儿我们想实现一个类,我们想让这个类的成员变量可以是任何类型,其实一个Room是可以放各样的东西的,所以这儿成员变量的类型为Object,表示这个房间可以放各样的东西。
想想如果我们在这个Room里面放的是一个字符串,但我们要取这个字段的时候我们以为自己之前存的是一个Integer类型的数据,这时候在运行期就会报错了。
3. 如果用泛型
class Room<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
}
public class Main {
public static void main(String[] args) {
Room<Integer> room = new Room<Integer>();
room.add(60);
Integer i = room.get();
System.out.println(i);
}
}
如果main方法改成如下,add一个字符串这时候就会出现编译错误信息。因Room<Integer>的实例对象只能add Integer类型的对象,编译器会做强类型检查。还有一个好处是,我们不在需要给get()方法取出来的对象塑型了,因为编译器知道get()方法会返回什么类型,而不是在运行期才知道。
4. 总结
虽然引入泛型的目的是在编译期的时候就能检查出错误来,但同时泛型的引入也增强了代码的可复用性。
参考:http://www.programcreek.com/2012/04/why-do-we-need-generic-types-in-java/