java 泛型小结

泛型小结:

泛型类:

泛型代替类中某一个可能会因为不同的调用而不同的类型。而在使用不同类型的数据替换泛型时,要将代码中所有相同的泛型全部替换。

Eg.

 

该段代码中的L即为泛型,不同类型的图的结点类型也是不同的,所以在进行不同的调用时,会用到不同类型的结点。下图就是调用String类型的结点。

 

对于接口中的泛过型,我们也可以通实现类将泛型具体化。

泛型方法:

泛型不仅可以针对类,还可以单独使某个方法是泛型的。

 

注意:java的泛型会有类型擦除的问题,即对于那些只有一个泛型做为类型的变量,其会被认为是Object类。之所以取出来自动就是我们传入的参数类型,这是因为编译器在编译生成的字节码文件中插入了类型转换的代码,不需要我们手动转型了。

 

泛型数组:

我们不能像直接实现泛型类一样直接实现泛型数组,有一下几个方法创建泛型数组。

1、使用ArrayList<T>

2、定义泛型数组的引用。即创建一个类型擦除的数组,然后转型。

  Eg.  A<T>为一个泛型类,想要创建泛型实现为String的数组:

       Public A<String>[] a;

a = (A<String>[])new A [100];

3、泛型为类型的数组,即T[] a;

        private T[] array;

        array = (T[])new Object[sz];   // 创建泛型数组

泛型数组的创建是创建一个 Object 数组,然后转型为 T[]。但数组实际的类型还是 Object[]但是如果后面有一个直接返回T[]数组的函数直接return array;则调用这个函数时会报ClassCastException异常。因为 Object[] 无法转型为T[]。同时,如果包含该数组的泛型类写的是<T extends XXX>,那么在创建泛型数组的哪一行就会ClassCastException异常。因为由于类型擦除,T被认为是XXX类,Object类无法转型成XXX类(除非是Object类)。因此我们在内部最好使用 Object[] 数组,在取出元素的时候再转型。想要调用整个数组就需要一个元素一个元素取出并转型放入另一个数组。

 

通配符的使用:

 

上边界限定通配符:

利用 <? extends XXX> 形式的通配符,可以实现泛型的向上转型

即:List<? extends XXX> list = ArrayList<YYY>();可以通过(其中YYY为XXX的子类)

通配符 List<? extends XXX> 表示某种特定类型 ( XXX 或者其子类 ) 的 List,但是并不关心这个实际的类型到底是什么,反正是 XXX的子类型,XXX 是它的上边界。因此它无法知道自己的类型到底是什么,可能是YYY,也可能是YYY的子类,所以我们确定其类型,也就无法向其中添加任何出了null以外的对象。

但是,如果我们在创建List的时候就给List元素,而不是后面添加,那么这个list返回XXX类型的方法可以正常使用。

 

下边界限定通配符:

<? super T>T 是类型参数的下界。使用这种形式的通配符,我们就可以 ”传递对象” 了。

同理,对于List<? super XXX> list 我们无法向其中加入高于XXX的类型。

猜你喜欢

转载自www.cnblogs.com/guestDJ/p/9184641.html
今日推荐