A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐鹏辰 中级黑马   /  2015-8-11 12:15  /  352 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐鹏辰 于 2015-8-11 12:21 编辑

泛型
JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。

好处
1.将运行时期出现 类型转换异常ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,安全。,
2,避免了强制转换麻烦。
格式:通过<>来定义要操作的引用数据类型。
什么时候写泛型呢
通常在集合框架中很常见,只要见到<>就要定义泛型。<> 就是用来接收类型的。

在使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
泛型类
什么时候定义泛型类?
当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。
  1. //创建泛型类
  2. class FanXing<FX>
  3. {
  4.          PrivateFX f;
  5.          publicvoid setObject(FX f)
  6.          {
  7.                    this.f=f;
  8.          }
  9.          publicFX getObject()
  10.          {
  11.                    return f;
  12.          }
  13. }
  14. //后期建立的对象类
  15. class Student
  16. {
  17. }
  18. //将要操作的数据类型作为参数传递到<>中
  19. class Demo
  20. {
  21.          publicstatic void main(String[] args)
  22.          {
  23.                    FanXing<Student>fx = new FanXing<Student>();
  24.                    fx.setObject(newStudent());
  25.                    Studentstu = fx.getObject();//无需强转操作
  26. }
  27. }
复制代码
泛型类定义的泛型作用于整个类中。如果要使用方法,泛型类的对象一明确要操作的具体类型后,所有方法操作的类型也就固定了。

泛型方法
为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
  1. //泛型方法
  2. class Demo
  3. {
  4.          Public<T> void show(T t)
  5.          {
  6.                    System.out.println("show:"+t);
  7.          }
  8.          public<Q> void print(Q q)
  9.          {
  10.                    System.out.println("print:"+q);
  11.          }
  12. }
复制代码

静态方法泛型
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

  1. //泛型类与泛型方法,静态方法泛型
  2. class Demo<T>
  3. {
  4.          publicvoid show(T t)//与泛型类一致
  5.          {
  6.                    System.out.println("show:"+t);
  7.          }
  8.          public<Q> void print(Q q)
  9.          {
  10.                    System.out.println("print:"+q);
  11.          }
  12.          publicstatic <W> void method(W w)//优先于对象存在
  13.          {
  14.                    System.out.println("method:"+w);
  15.          }
  16. }
复制代码
泛型定义在方法上时,应放在返回值类型之前,修饰符之后。
泛型接口
  1. //定义泛型接口
  2. interface Inter<T>
  3. {
  4.          voidshow(T t);
  5. }
  6. //泛型接口的实现有两种情况
  7. //实现时明确数据类型
  8. class InterImpl implementsInter<String>
  9. {
  10.          publicvoid show(String t)
  11.          {
  12.                    System.out.println("show:"+t);
  13.          }
  14. }
  15. /实现时还不能明确数据类型
  16. class InterImpl<T> implementsInter<T>
  17. {
  18.          publicvoid show(T t)
  19.          {
  20.                    System.out.println("show:"+t);
  21.          }
  22. }
复制代码

泛型的高级应用
通配符
在泛型中?是通配符、占位符。
  1. public static voidprintColl(ArrayList<?> al)
  2. {
  3.          Iterator<?>it = al.iterator();
  4.          while(it.hasNext())
  5.          {
  6.                    System.out.println(it.next());
  7.          }
  8. }
复制代码

T?的区别
  1. public static<T> voidprintColl(ArrayList<T> al)
  2. {
  3.          Iterator<T>it = al.iterator();
  4.          while(it.hasNext())
  5.          {
  6.                    Tt=it.next();//用T可以接受和操作类型,而?不可以。
  7.                    System.out.println(it.next());
  8.          }
  9. }
复制代码

与多态道理一致,泛型不能使用类型特有方法。
泛型的限定
ArrayList< Person> al = newArrayList<Student>();          error
<? extends E>  只接受E类型或E的子类型;限制上限
TreeSet(Collection<?extends E> c)           构造函数传入可比较的对象
<? super E>       只接受E类型或E的父类型;限制下限
TreeSet(Comparator<?super E> comparator)         构造函数传入比较器
泛型限定是进行 泛型扩展用。

5 个回复

倒序浏览
你是自学还是在黑马去学的
回复 使用道具 举报
danniu1314 发表于 2015-8-11 12:52
你是自学还是在黑马去学的

现在是在家里自学的,8月19号到黑马基础班学
回复 使用道具 举报
徐鹏辰 发表于 2015-8-11 13:16
现在是在家里自学的,8月19号到黑马基础班学

加油,我平时上班自学太慢,昨天辞职,准备去黑马了。去基础班
回复 使用道具 举报
danniu1314 发表于 2015-8-11 16:19
加油,我平时上班自学太慢,昨天辞职,准备去黑马了。去基础班

嗯嗯,一起努力!
回复 使用道具 举报
谢谢分享,学习了~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马