黑马程序员 日记七:泛型总结

来源:互联网 发布:sql外连表exists 编辑:程序博客网 时间:2024/04/27 20:16

不同于数组,在容器中存入数据,通常数据类型是任意的,也就是说,存入的元素可以是不同数据类型的,这样的麻烦就是,造成取出数据的时候,类型转换上的麻烦。例如:

ArrayList al1 = new ArrayList ();al1.add("abc");al1.add("789");al1.add("ddd");al1.add(3);ListIterator it = al1.listIterator();while (it.hasNext()) {String str = (String)it.next();System.out.println(str);}

这种写法就会造成类转换异常,为了解决这样的问题,在JDK1.5中引入了一种机制——泛型机制。这种机制的好处是,把只能在运行时才能观察到的错误提前到编译时就能发现,及时解决。

例如,将以上代码中实例化ArrayList时,变成如下格式

ArrayList<String> al1 = new ArrayList<String>();

就会在编译时,对al1.add(3)进行检查,然后报错,当然,迭代器也可以使用泛型机制:ListIterator<String> it = al1.listIterator();这样就避免了在循环中取出元素再进行强制类型转换了。

以上代码用泛型机制写就是如下形式:

ArrayList<String> al1 = new ArrayList<String>();al1.add("abc");al1.add("789");al1.add("ddd");ListIterator<String> it = al1.listIterator();while (it.hasNext()) {String str = it.next();System.out.println(str);}

在声明一个类时候使用泛型

自定义一个类,若要用到泛型,可以用如下形式:

class Student<T> {T t;}

在自定义的类中,实现带有泛型的方法:

class Student {public <T> void show(T t) {}}

或者

class Student <T> {public void show(T t) {}}

但是用如此形式定义的泛型,是不支持静态方法的。因为静态方法是随着类的加载而进入方法区的,而泛型具体是什么类型是在实例化对象时才明确的,也就是说,泛型代表的类型明确晚于静态方法加载,这样会使其要操作的对象类型不明确,如果必须在静态方法上使用泛型,可以用如下形式:

public static <T> void show(T t) {}接口上使用泛型:interface Inte <T> {void show (T t);}然后用类来实现这个接口,class InteClass implements Inte<String> {void show (){}}如果在定义类的时候,仍然不明确数据类型,就可以采用如下方式,class InteClass <T> implements Inte<T> {void show (T t) {}}

泛型的扩展:

泛型的扩展主要有两种表现形式,<? extends E><? super E>,这两种方式都是用来指定泛型可表示类的范围,前者是用来指定上限的,该类及其子类适用;后者是用来指定下限的,该类及其父类适用。



原创粉丝点击