泛型

来源:互联网 发布:写网络小说雷点 知乎 编辑:程序博客网 时间:2024/05/17 01:15

泛型简介:

  泛型是在Java JDK1.5出现的一种安全机制。它的作用是在定义集合时指定向集合中添加的数据类型,而不能添加指定类型之外的类型。当泛型给javac编译器提供集合时,会去掉“类型”信息,保证了运行效率。也正因为编译生成的字节码会去掉泛型的类型信息,因此我们只要能跳过编译器,就可以往泛型集合中加入其它类型的数据,如用反射得到集合,再调用add方法即可。

泛型格式:

  向< >中添加需要操作的引用数据类型

  如:TreeSet<String> 就是将存入集合的元素指定为String类型

泛型术语:

  例如:ArrayList<E>类和ArrayList<Integer>

    1、ArrayList<E>整体称为泛型类型;

    2、ArrayList<E>中的E称为类型变量或类型参数;

    3、整个ArrayList<Integer>称为参数化类型;

    4、ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数;

    5、ArrayList<Integer>中的< >称为typeof;

    6、ArrayList称为原始类型。

泛型好处:

  1、泛型可以将集合中的元素限定为一个特定类型,使得集合中只能存储同一类型的对象;这样我们就把运行时出现的ClassCastException(类型转换不兼容异常)转移到了编译时期,让运行时期问题减少,提高了安全性。

  2、当从集合中获取一个对象时,编译器也可知道这个对象的类型,不需要对对象进行强制转化,更加方便。

什么时候用泛型?

  通常在集合框架中很常见,只要见到< >就要定义泛型,< >用来接收类型,将集合中要存储的数据类型作为参数传递到< >中即可。

参数化类型与原始类型:

  1、参数化类型与原始类型的兼容性

    1)参数化类型可以引用一个原始类型的对象,编译期间会报警告,但是能否通过编译,要看编译器。

       如:Collection<String> coll = new Date();

    2)原始类型可以引用一个参数化类型的对象,编译期间会报警告。

       如:Collection coll = new Vector<String>();

  2、参数的类型不考虑类型参数的继承关系:

    Vector<String> v = new Vector<Objec>();//错
    Vector<Objec> v = new Vector<String>();//错

  3、在创建数组实例时,数组的元素不能使用参数化的类型:

     如:Vector<Integer> v[] = newVector<Integer>[10];//错

对于同一范围内同类事物,可以通过泛型限定的方式定义,有两种方式:

  1、? extends E:可接收E类型或E类型的子类型。

    如:Vector<? extends Number> x = newvector<Integer>();

   2、? super E:可接收E类型或E类型的父类型。

    如:Vector<? super Integer>x = newvector<Number>();


1

3 0