------- android培训java培训、期待与您交流! ----------

泛型:

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

泛型好处: 

1.将运行时期出现问题ClassCastException,转移到了编译时期。方便于程序员解决问题。让运行时问题减少,安全。,

2.避免了强制转换麻烦。

泛型格式:

                   
通过<>来定义要操作的引用数据类型。

什么时候用泛型:

在使用java提供的对象时,通常在集合框架中很常见,只要见到<>就要定义泛型。其实<> 就是用来接收类型的。

 

                                 当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

泛型特点:

                     提高了程序的安全性

将运行期遇到的问题转移到了编译期

省去了类型强转的麻烦

泛型类的出现优化了程序设计

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3.  
  4. /**
  5. * 泛型的简单演示:
  6. *
  7. */
  8. public class GenericDemo
  9. {
  10. public static void main(String[] args)
  11. {
  12. ArrayList<String> al = new ArrayList<String>();
  13.  
  14. al.add("01");
  15. al.add("02");
  16. al.add("03");
  17.  
  18. for (Iterator<String> it = al.iterator();it.hasNext(); )
  19. {
  20. System.out.println(it.next());
  21. }
  22. }
  23. }

什么时候定义泛型类?

当类中要操作的引用数据类型不确定的时候,
早期定义Object来完成扩展。

现在定义泛型来完成扩展。

  1. class Worker
  2. {
  3. }
  4. class Student
  5. {
  6. }
  7. //泛型前做法。
  8. class Tool
  9. {
  10. private Object obj;
  11. public void setObject(Object obj)
  12. {
  13. this.obj = obj;
  14. }
  15. public Object getObject()
  16. {
  17. return obj;
  18. }
  19. }
  20. //泛型后做法。
  21. class Utils<type>
  22. {
  23. private type q;
  24. public void setObject(type q)
  25. {
  26. this.q = q;
  27. }
  28. public type getObject()
  29. {
  30. return q;
  31. }
  32. }
  33. class GenericDemo
  34. {
  35. public static void main(String[] args)
  36. {
  37.  
  38. Utils<Worker> u = new Utils<Worker>();
  39.  
  40. u.setObject(new Worker());
  41. }
  42. }

泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。


 

为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

泛型特殊之处:

静态方法不可以访问类上定义的泛型。

如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

  1. class Demo<T>
  2. {
  3. public void show(T t)
  4. {
  5. System.out.println("show:"+t);
  6. }
  7. public <Q> void print(Q q)
  8. {
  9. System.out.println("print:"+q);
  10. }
  11. public static <W> void method(W t)
  12. {
  13. System.out.println("method:"+t);
  14. }
  15. }
  16. class GenericDemo4
  17. {
  18. public static void main(String[] args)
  19. {
  20. Demo <String> d = new Demo<String>();
  21. d.show("haha");
  22. d.print(5);
  23. d.print("hehe");
  24. Demo.method("hahahahha");
  25. }
  26. }
  1. //泛型定义在接口上。
  2. interface Inter<T>
  3. {
  4. void show(T t);
  5. }
  6. class InterImpl<T> implements Inter<T>
  7. {
  8. public void show(T t)
  9. {
  10. System.out.println("show :"+t);
  11. }
  12. }
  13. class GenericDemo5
  14. {
  15. public static void main(String[] args)
  16. {
  17. InterImpl<Integer> i = new InterImpl<Integer>();
  18. i.show(4);
  19. }
  20. }

? 通配符,也可以理解为占位符。

泛型的限定:

? extends E: 可以接收E类型或者E的子类型。上限。

? super E: 可以接收E类型或者E的父类型。下限

  1. import java.util.*;
  2.  
  3. class Person
  4. {
  5. private String name;
  6. Person(String name)
  7. {
  8. this.name = name;
  9. }
  10. public String getName()
  11. {
  12. return name;
  13. }
  14. }
  15. class Student extends Person
  16. {
  17. Student(String name)
  18. {
  19. super(name);
  20. }
  21. }
  22. class GenericDemo6
  23. {
  24. public static void main(String[] args)
  25. {
  26. ArrayList<Person> al = new ArrayList<Person>();
  27. al.add(new Person("abc1"));
  28. al.add(new Person("abc2"));
  29. al.add(new Person("abc3"));
  30. printColl(al);
  31.  
  32. ArrayList<Student> al1 = new ArrayList<Student>();
  33. al1.add(new Student("abc--1"));
  34. al1.add(new Student("abc--2"));
  35. al1.add(new Student("abc--3"));
  36. printColl(al1);
  37.  
  38. }
  39. public static void printColl(Collection<? extends Person> al)
  40. {
  41. Iterator<? extends Person> it = al.iterator();
  42. while(it.hasNext())
  43. {
  44. System.out.println(it.next().getName());
  45. }
  46. }
  47. }
  1. import java.util.*;
  2.  
  3. class Person
  4. {
  5. private String name;
  6. Person(String name)
  7. {
  8. this.name = name;
  9. }
  10. public String getName()
  11. {
  12. return name;
  13. }
  14. public String toString()
  15. {
  16. return "person :"+name;
  17. }
  18. }
  19.  
  20. class Student extends Person
  21. {
  22. Student(String name)
  23. {
  24. super(name);
  25. }
  26. }
  27. class Worker extends Person
  28. {
  29. Worker(String name)
  30. {
  31. super(name);
  32. }
  33. }
  34. class GenericDemo7
  35. {
  36. public static void main(String[] args)
  37. {
  38.  
  39. TreeSet<Student> ts = new TreeSet<Student>(new Comp());
  40.  
  41. ts.add(new Student("abc03"));
  42. ts.add(new Student("abc02"));
  43. ts.add(new Student("abc06"));
  44. ts.add(new Student("abc01"));
  45. Iterator<Student> it = ts.iterator();
  46. while(it.hasNext())
  47. {
  48. System.out.println(it.next().getName());
  49. }
  50. TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
  51. ts1.add(new Worker("wabc--03"));
  52. ts1.add(new Worker("wabc--02"));
  53. ts1.add(new Worker("wabc--06"));
  54. ts1.add(new Worker("wabc--01"));
  55. Iterator<Worker> it1 = ts1.iterator();
  56. while(it1.hasNext())
  57. {
  58. System.out.println(it1.next().getName());
  59. }
  60. }
  61. }
  62. class Comp implements Comparator<Person>
  63. {
  64. public int compare(Person p1,Person p2)
  65. {
  66. return p2.getName().compareTo(p1.getName());
  67. }
  68. }
  1. import java.util.*;
  2.  
  3. class Person
  4. {
  5. private String name;
  6. Person(String name)
  7. {
  8. this.name = name;
  9. }
  10. public String getName()
  11. {
  12. return name;
  13. }
  14. public String toString()
  15. {
  16. return "person :"+name;
  17. }
  18. }
  19. class Student extends Person
  20. {
  21. Student(String name)
  22. {
  23. super(name);
  24. }
  25. }
  26. class GenericTest
  27. {
  28. public static void main(String[] args)
  29. {
  30. ArrayList<Person> al = new ArrayList<Person>();
  31. al.add(new Person("ahah"));
  32. ArrayList<Student> al1 = new ArrayList<Student>();
  33. al1.add(new Student("haha"));
  34. al.addAll(al1);
  35. Iterator<Person> it = al.iterator();
  36. while(it.hasNext())
  37. {
  38. System.out.println(it.next().getName());
  39. }
  40. }
  41. }

------- android培训java培训、期待与您交流!
----------

黑马程序员——JAVA基础之泛型和通配符的更多相关文章

  1. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  2. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  3. 黑马程序员----java基础笔记上(毕向东)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 笔记一共记录了毕向东的java基础的25天课程,分上.中.下 本片为上篇,涵盖前10天课程 1. ...

  4. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

  5. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

  6. 黑马程序员——JAVA基础之File类,递归,打印流,合并切割流

    ------- android培训.java培训.期待与您交流! ---------- File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递 ...

  7. 黑马程序员——JAVA基础之多线程的安全问题

    ------- android培训.java培训.期待与您交流! ---------- 导致多线程出现问题的一个特殊的状态:就绪.具备了执行资格,但是还没有获取资源. 导致安全问题的出现的原因: 1. ...

  8. 黑马程序员——JAVA基础之简述设计模式

    ------- android培训.java培训.期待与您交流! ---------- 设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓 ...

  9. 黑马程序员——JAVA基础之常用DOS命令和环境变量的配置

    ------- android培训.java培训.期待与您交流! ----------   1.常用dos命令: dir   显示当前文件下目录                             ...

随机推荐

  1. Android程序之全国天气预报查询接口演示

    一.项目演示效果如下: 二.使用 聚合数据SDK 注册账号-创建一个新应用(在个人中心页面-数据中心-申请数据)–填入自己的应用–找到分类–天气预报-全国天气预报 下载sdk (由于项目使用的是1点几 ...

  2. Mac下为我们开发的App制作gif动画演示(不仅仅针对开发者,想做gif图片的也可参考)

    趁着工作不忙,就闲着倒腾自己的事情,把自己写的一个完整App<丁丁印记>整理了一番,总结其中用到的技术和实现的功能,并想把一些用到的技术分享给各位工友们,因为我自学iOS开发得益于大家的分 ...

  3. jQuery 操作CSS

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 系统的 host文件的作用

    有些用户可能已经注意到,我们在上网时除了可使用常规的 http://www.xxx.com或http://www.xxx.com.cn等形式的网站域名之外,还可以使用类似于“202.106.184.2 ...

  5. BZOJ 3439 Kpm的MC密码

    倒着建trie,然后主席树来求子树第k大. #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  6. BZOJ 1968 约数研究

    其实打个表就会发现,这个玩意儿是积性的,然后很happy的搞了一下. 不,不是这样. 考虑每个约数对答案的贡献,不难发现:约数i的贡献为n/i. 加之即可. #include<iostream& ...

  7. PHP中的日期和时间

    日期和时间    1.UNIX时间戳        以32位整数表示的格林威治标准时间        这个UNIX时间戳整数是从1970年1月1日0时0分0秒(计算机元年)到现在的秒数         ...

  8. HTML的表单

    HTML表单 <!-- <form></form>标签对用来创建一个表单,即定义表单的开始和结束位置,<form>表单具有下面等属性 1.action属性用来 ...

  9. JQuery源码分析(六)

    方法链式调用的实现 写的更少,做的更多.是JQuery的核心理念. 那么链式方法的设计与这个核心理念不谋而合.那么从深层次考虑这种设计其实就是一种Internal DSL. DSL是指Domain S ...

  10. 30道四则运算<2>

    #include<iostream> #include<time.h> #include<fstream> #define random() (rand()%100 ...