1.泛型的定义
泛型就是允许在定义类,接口时指定类型参数,这个类型参数将在声明变量、创建对象时确定,则不同类型的对象就不会添加到该泛型集合中。也不需进行强制类型转换。
2.泛型的好处
在没有泛型之前,一旦把一个对象加入到Java容器(集合)中,集合就会忘记对象的类型,把所有的对象都当成Object类型处理,当程序从集合中取出对象后,就需要进行强制类型转换,而这种转换不仅代码臃肿,而且容易引起ClassCastException异常。
3.泛型类派生子类
1)当创建了带泛型声明的接口、父类之后、可以为该接口创建实现类,或从该父类派生子类,但不能包含类型参数:
正确方式如下:public class A extends B<String>,B为一泛型接口,或含有泛型参数的类。也可以不指定类型,如下
public class A extends B;
2)并未生成真正的泛型类
如:ArrayLIst<String>和ArrayLIst<Integer>仍是相同的类,系统不会为其生成新的class文件。但不能使用instanceof运算符进行判断。如下:
Collection cs=new Arraylist<String>(); if(cs instanceof List<String>)//将会引起编译错误,instanceof运算符后不能使用泛型类 {}
4.当不确定泛型类的类型实参时,一般使用类型通配符?来代替,使用如下:
public void test(List<?> c) { for(int i=0;i<c.size();i++) { System.out.println(c.get(i)); } }
但不能这样使用:
List<?> c=new ArrayList<String>(); c.add(new Object());
此时List<?>可以理解是任何泛型List的父类。如果我们只想表示某一类泛型List的父类,可使用如下方法:
public abstract class Sharp { public abstract void draw(Canvas c); } public class Canvas { public void drawall(List<? extends Sharp> sharps){}//该函数中的参数被限制为Sharp类的子类类型的参数 }
也可以在定义含有泛型参数的类时设定类型形参的上限,如下:
public class Apple<T extends Number>
5.泛型方法
定义:在声明方法时定义一个或多个类型参数,如下:
修饰符<T,S>返回值类型 方法名(形参列表){方法体}
static <T> void fun(T[] a,Collection<T> c)