一、概念 泛型是JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制。
public class GenericTest{ public static void main(String [] args){ ArrayList a1=new ArrayList(); a1.add("abc"); a1.add(4); Iterator it=a1.iterator(); while(it.hasNext()){ String s=(String)it.next(); System.out.PRintln(s+":"+s.length()); } }}这段代码编译结果是正常的但是在运行阶段会出现ClassCastException异常,主要是因为我们在集合ArrayList中即存了String又存了integer,但是当我们获取时String s=(String)it.next();用的是String类型,忽略了4是int型。为了解决这个问题引入了泛型,它由两个好处: 1.将运行时期出现的问题 classCastException转移到了编译时期。 2.避免了强制类型转换的麻烦。
二、定义泛型类、泛型方法 1、泛型类
public class pair<T>{ private T first; private T second; public pair() { first=null; second=null; } public pair(T first,T second) { this.first=first; this.second=second; } public getFirst() { return first; } public getSecond() { return second; } public setFirst(T value) { first=value; } public setSecond(T value) { second=value; }}用具体的类型替换类型变量就可以实例化泛型类型,例如pair()、pair(person p1,person p2) 说明:(1)泛型类可以有多个类型变量例如public class Pair
Class GenericTest{ public static<T> T getMiddle(T ...a) { return a[a.length/2] }}泛型方法可以定义在普通类中也可以定义在泛型类中,调用时格式:
T middle=GenericTest.<T>getModdle(...);
三、类型变量的限定
class GenericTest{ public static <T>min(T[] a) { if(a==null||a.length==0) return 0; T smallest=a[0]; for(int i=1;i<a.length;i++) { if(smallest.compareTo(a[i])) smallest=a[i]; } return smallest; }}有以上代码我们可以知道smallest 是T类型的,但是我们不能保证T所属的类中有compareTo方法,例如T为我们自己定义的person类,里面没有compareTo方法,这样person smallest =a[0];smallest .compareTo(a[i])是错误的,为了能保证T所属的类中均有compareTo方法,我们可以将T设定为实现类Compareable接口(只含有一个compareTo方法)的类。
public static<T extends Compareable>T min(...)。
同理也可以有多个类型的限定 T extends Comparesble&Seriallizable
四、泛型类型继承规则 (1)继承:两个类Employee和其子类Manager,但是pair<Employee>
和Pair<Manager>
之间是没有关系的。 (2)泛型类可以扩展实现其他泛型类如:ArrayList<T>
类实现了List<T>
类的接口,则ArrayList<Manager>
可以被转换成List<Manager>
五、类型通配符 下面是一个打印雇员的泛型方法
上面的方法只能被Employee 对象调用,现在我们需要打印学生,则需要在写一个打印学生的泛型方法,经上面代码中的Employee修改为student。为了减小复杂度可以用通配符? 来代替Employee这样无论打印多少什么类型的对象都可用这个方法
public void printtest(Pair <?> p){ system.out.println(p.setFirst(p.getSEcond));}·通配符的两种限定: (1)向上限定:?extends E 接收E类型或者E的子类型。 (2)向下限定: ?super E 接收E类型或者E的父类型。
新闻热点
疑难解答