泛型(Generics)是一种参数化类型机制,一个类或者方法要处理一个对象一般会使用多态,一是把这个对象定义为接口
,就可以处理扩展这个接口的对象了,但这种方法有很大的局限性,被处理类要扩展这个接口,以前的类不能复用的个处理类;或者把接受的对象定义为Object
,但这种方式要做类型检查也容易出现ClassCastException。
Java1.5的时候引入泛型的机制,由于要兼容之前版本的代码,Java对于泛型只是在编译器上面动了手脚,所以有一些局限性,后面的章节会详细讲解这点。
下面举一个例子对比泛型带来的好处
未使用泛型:
List list = new ArrayList();
list.add(1);
list.add("123");
list.add(false);
Object o1 = list.get(0);
String o2 = (String) list.get(1); //会产生ClassCastException
boolean o3 = (Boolean) list.get(2);
可以看出如果要类型转换才能拿到除Object外的类型,如果你拿到其他人写的方法返回一个list,还有去弄清楚每个元素是什么类型,难以维护。当然我们平时用的时候也不会往一个list放不同类型的对象,但也免不了要查阅list里面约定的是放什么类型和类型转换后才能使用。
使用泛型就可以免除这种烦恼:
List<String> list = new ArrayList<String>();
//List<String> list = new ArrayList<>(); //Java1.7后会自动类型推断
list.add("123");
//list.add(false); //编译器会报错,不允许传非String的类型
String o2 = list.get(0); //不需要转型,编译器会帮忙处理
//boolean o3 = list.get(1);//类型不对应,编译不通过
使用泛型之后,编译器会帮我们做类型约束和检验,可以使代码更优雅
目录
学会Java泛型系列(零):简介及目录
学会Java泛型系列(一):Java泛型
学会Java泛型系列(二):泛型定义与使用
学会Java泛型系列(三):泛型原理-擦除
学会Java泛型系列(四):擦除带来的问题以及解决办法
学会Java泛型系列(五):限定符
学会Java泛型系列(六):总结
学会Java泛型系列(七):常用案例