泛型

来源:互联网 发布:我想在淘宝开店 编辑:程序博客网 时间:2024/06/05 07:30
1.集合泛型 :
在jdk1.5以前对象一旦存入集合就丢失了类型,在获取时需要进行强转,麻烦并且容易出错.
在jdk1.5以后提供了泛型技术,可以在定义泛型时明确制定存储的类型.
泛型是给java编译器使用的,只在编译阶段可见,在源码文件编译为字节码文件的过程中,泛型会被移除掉,这个过程叫做泛型的擦出.

2.自定义泛型:
(1)方法上使用泛型:
定义在方法上的泛型:public <T> T method(T t); public <T> void method(T t);
作用范围为当前方法
在方法被调用时,编译器自动判断出泛型的具体类型
(2)可以定义多个泛型:
public static <K,V> V getValue(K key) { return map.get(key);}

(3)类上使用泛型:
定义在类上的泛型 :
public class GenericDao<T> {
private T field1;
public void save(T obj){}
public T getId(int id){}
}
  作用范围为整个类
在创建类的对象时,就需要明确的制定泛型的具体类型.如果不指定默认为此泛型的上边界,如果没有上边界则是默认的上边界Object
所谓的集合泛型其实就是类上泛型的一个例子
静态方法不能使用类定义的泛形,而应单独定义泛形

泛型是没有继承结构的,在定义泛型的时候,两边可以都没有,可以一边又一边没有,可以两边都有,但是要注意,如果两边都有,则一定要一致.

3.泛型通配符:
由于泛型没有继承关系,所以
List<String> list1 = new ArrayList<String>();
List<Integer> list2 = new ArrayList<Integer>();

List<Object> list0= null;
list0=list1;//报错
list0=list2;//报错

list0没有办法引用list1和list2,这时,该如何设计list0的泛型使他能够引用list1和list2呢?
此时引入泛型通配符可以写成
List<?> list0 = null;
表明当前集合泛型的具体类型是不确定的,此时这个引用就可以接受任意具体类型泛型.

4.泛型的边界:
使用了泛型通配符以后,List<?>list0 就可以等于任意的类型了,但是有时我们还可能需要对这个引用可以接受的泛型类型进行一些限定:

<? extends Teacher>定义泛型的上边界:
也就说可以通过这种方式定义此泛型所接受的具体类型必须是限定的上边界类型或其子类类型.
这样一来可以限定此泛型所接受的类型为上边界类型及其子类型
在使用这个泛型时可以使用这个泛型上边界所具有的方法
如果不明确限定泛型的上边界,则默认的上边界Object

<? super Teacher>定义泛型的下边界:
也就是说,可以通过这种方式定义此番行接受的具体类型必须是限定的下边界类型或其父类型.
这样依赖可以限定所接受的类型必须为下边界类型或其父类型
0 0
原创粉丝点击