本帖最后由 徐鹏辰 于 2015-8-11 12:21 编辑
泛型 JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
好处 1.将运行时期出现 类型转换异常ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,安全。, 2,避免了强制转换麻烦。 格式:通过<>来定义要操作的引用数据类型。 什么时候写泛型呢? 通常在集合框架中很常见,只要见到<>就要定义泛型。<> 就是用来接收类型的。
在使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。 泛型类 什么时候定义泛型类? 当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。 - //创建泛型类
- class FanXing<FX>
- {
- PrivateFX f;
- publicvoid setObject(FX f)
- {
- this.f=f;
- }
- publicFX getObject()
- {
- return f;
- }
- }
- //后期建立的对象类
- class Student
- {
- }
- //将要操作的数据类型作为参数传递到<>中
- class Demo
- {
- publicstatic void main(String[] args)
- {
- FanXing<Student>fx = new FanXing<Student>();
- fx.setObject(newStudent());
- Studentstu = fx.getObject();//无需强转操作
- }
- }
复制代码泛型类定义的泛型作用于整个类中。如果要使用方法,泛型类的对象一明确要操作的具体类型后,所有方法操作的类型也就固定了。
泛型方法 为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。 - //泛型方法
- class Demo
- {
- Public<T> void show(T t)
- {
- System.out.println("show:"+t);
- }
- public<Q> void print(Q q)
- {
- System.out.println("print:"+q);
- }
- }
复制代码
静态方法泛型 特殊之处: 静态方法不可以访问类上定义的泛型。 如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
- //泛型类与泛型方法,静态方法泛型
- class Demo<T>
- {
- publicvoid show(T t)//与泛型类一致
- {
- System.out.println("show:"+t);
- }
- public<Q> void print(Q q)
- {
- System.out.println("print:"+q);
- }
- publicstatic <W> void method(W w)//优先于对象存在
- {
- System.out.println("method:"+w);
- }
- }
复制代码泛型定义在方法上时,应放在返回值类型之前,修饰符之后。 泛型接口 - //定义泛型接口
- interface Inter<T>
- {
- voidshow(T t);
- }
- //泛型接口的实现有两种情况
- //实现时明确数据类型
- class InterImpl implementsInter<String>
- {
- publicvoid show(String t)
- {
- System.out.println("show:"+t);
- }
- }
- /实现时还不能明确数据类型
- class InterImpl<T> implementsInter<T>
- {
- publicvoid show(T t)
- {
- System.out.println("show:"+t);
- }
- }
复制代码
泛型的高级应用 通配符 在泛型中?是通配符、占位符。 - public static voidprintColl(ArrayList<?> al)
- {
- Iterator<?>it = al.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next());
- }
- }
复制代码
T与?的区别 - public static<T> voidprintColl(ArrayList<T> al)
- {
- Iterator<T>it = al.iterator();
- while(it.hasNext())
- {
- Tt=it.next();//用T可以接受和操作类型,而?不可以。
- System.out.println(it.next());
- }
- }
复制代码
与多态道理一致,泛型不能使用类型特有方法。 泛型的限定 ArrayList< Person> al = newArrayList<Student>(); error <? extends E> 只接受E类型或E的子类型;限制上限 TreeSet(Collection<?extends E> c) 构造函数传入可比较的对象 <? super E> 只接受E类型或E的父类型;限制下限 TreeSet(Comparator<?super E> comparator) 构造函数传入比较器 泛型限定是进行 泛型扩展用。
|