泛型是为了限定类型设置的。例如,原先在ArrayList的对象里面存取的Object对象,每一次迭代取出数据的时候,都要进行强制的类型转换,如果是知道类型还好些,如果不知道的话就有可能产生问题。
ArrayList list=new ArrayList();
ArrayList<String> list1=new ArrayList<String>();
这里面list保存的Object类型的对象,下面list1保存的是String类型的对象。当为list1添加非字符串元素的时候会出现编译错误。当迭代取出list1中的元素时,类型为字符串类型。
当我们设定了一个继承关系,父类为Bean,子类为ABean,BBean,等等。又设置了一个ArrayList的list对象来保存这个继承关系相关的对象,有要求取出的时候不需要进行强制类型转换,这个时候可以这样使用泛型来操作:
ArrayList<? extends Bean> list=new ArrayList<? extends Bean>();
这样的话就可以限定保存的类型为Bean的子类型。这样的设置在抽象父类的抽象方法的返回值类型设定上会有很大的便利性。
上面的这些对于不需要特别正对泛型类型编程的来说足够用了。
在往下面说,针对泛型的编程其实就有把泛型控制的类型作为一个通用的标示,当把这个标示替换为实际的类型的时候,程序会像普通的有确定参数的一段程序是一模一样的。看下面:
- class Point<T>{ // 此处可以随便写标识符号,T是type的简称
- private T var ; // var的类型由T指定,即:由外部指定
- public T getVar(){ // 返回值的类型由外部决定
- return var ;
- }
- public void setVar(T var){ // 设置的类型也由外部决定
- this.var = var ;
- }
- };
- public class GenericsDemo06{
- public static void main(String args[]){
- Point<String> p = new Point<String>() ; // 里面的var类型为String类型
- p.setVar("it") ; // 设置字符串
- System.out.println(p.getVar().length()) ; // 取得字符串的长度
- }
- };
这个其实就像是对不同类型写相同的类,由于类型不同,导致类中只有有限的部分不同。抽取不同的部分,进行封装,就是泛型编程的关键了。