v 一.程序中无形之中用到的泛型
  1. import java.util.*;
  2. class Person implements Comparable<Person>{
  3. String name;
  4. int age;
  5. Person(){
  6. name = "";
  7. age = 0;
  8. }
  9. Person(String name, int age){
  10. this.name = name;
  11. this.age = age;
  12. }
  13. public String toString(){
  14. return name + "...." + age;
  15. }
  16.  
  17. public int compareTo(Person o){
  18.  
  19. if(name.compareTo(o.name)==0)
  20. return o.age - age;
  21. return o.name.compareTo(name);
  22. }
  23. }
  24.  
  25. class Student extends Person{
  26. int score;
  27. public Student(){
  28. super();
  29. }
  30. public Student(String name, int age, int score){
  31. super(name, age);
  32. this.score = score;
  33. }
  34.  
  35. public String toString(){
  36. return name + "...." + age + "...." + "score: " + score;
  37. }
  38. }
  39.  
  40. class Worker extends Person{
  41. int salary;
  42. public Worker(){
  43. super();
  44. }
  45. public Worker(String name, int age, int salary){
  46. super(name, age);
  47. this.salary = salary;
  48. }
  49.  
  50. public String toString(){
  51. return name + "...." + age + "...." + "salary: " + salary;
  52. }
  53. }
  54.  
  55. class ComparatorPerson implements Comparator<Person>{
  56. public int compare(Person o1, Person o2){
  57. if(o1.name.compareTo(o2.name)==0)
  58. return o1.age - o2.age;
  59. return o1.name.compareTo(o2.name);
  60. }
  61. }
  62.  
  63. public class Test{
  64. public static void main(String[] args){
  65. ArrayList<Person> arr = new ArrayList<Person>();
  66. arr.add(new Person("hujunzheng", 22));
  67. arr.add(new Person("caihaibin", 21));
  68. arr.add(new Person("huangweidong", 22));
  69.  
  70. ArrayList<Student> arr1 = new ArrayList<Student>();
  71. arr1.add(new Student("hujunzheng", 22, 500));
  72. arr1.add(new Student("caihaibin", 21, 444));
  73. arr1.add(new Student("huangweidong", 22, 777));
  74.  
  75. ArrayList<Worker> arr2 = new ArrayList<Worker>();
  76. arr2.add(new Worker("789", 22, 500));
  77. arr2.add(new Worker("465", 21, 444));
  78. arr2.add(new Worker("798", 22, 777));
  79.  
  80. //public boolean addAll(Collection<? extends E> c)// 泛型的上限:用于存储的数据
  81. // 如果不是<? extends E> 而只是<E> 那么E的子类型就不能加载进来!因为Collection<Person> 和 ArrayList<Student>泛型管理的不是同一数据类型
  82. // 而 <? extends E> 要求传进来的对象实例管理的泛型只要是 E 或者是 E的子类都行!
  83. arr.addAll(arr1);
  84. arr.addAll(arr2);
  85.  
  86. Object[] oo = null;
  87. Arrays.sort(oo=arr.toArray());
  88. for(Object o : oo)
  89. System.out.println(o);
  90.  
  91. //public TreeSet(Comparator<? super E> c); 传递的是比较泛型为 E 或者是 E的父类的比较器
  92. //在进行 E类型两个数据比较的时候, 用 E类 或者 E类型的父类型进行接收,并使用 ?类型的定义的比较方式!
  93.  
  94. System.out.println("泛型上限,下限...................................................");
  95. TreeSet<Worker> tw = new TreeSet<Worker>(new ComparatorPerson());// E 是 Worker, 传递的是其父类Person的比较器
  96. tw.addAll(arr2);
  97.  
  98. for(Iterator it = tw.iterator(); it.hasNext(); )
  99. System.out.println(it.next());
  100.  
  101. TreeSet<Student> ts= new TreeSet<Student>(new ComparatorPerson());// E 是 Student, 传递的是其父类Person的比较器
  102. ts.addAll(arr1);
  103.  
  104. for(Object o : ts.toArray())
  105. System.out.println(o);
  106. //上述的Worker 和 Student在TreeSet中排序时使用的比较器都是Person类实现的比较器
  107. }
  108. }
  109.   
v 二.简单的理解
  1. ArrayList<Person> alist = new ArrayList<Person>();
  2. ArrayList<? extends Person> list = new ArrayList<Student>();
  3. alist.addAll(list);
    Person p = new Person();
    Student s = new Student();
    //compile error
    list.add(p);或者 list.add(s);

一般来讲,定义成<? extends T>的参数通常只能用来从里面取数据,而不能用add方法添加数据。

  1. ArrayList<? super Person> list = new ArrayList<Person>();
  2. Student s = new Student();
  3. list.add(s);
  4. s = (Student) list.get(0);

而定义成<? super T>的参数是可以用add方法来进行数据的添加的。它接受的 T类型或者T的父类,为什么Student是Person的子类但是仍能接受呢?因为在加入的时候讲Sutdent进行了向上转型为Object,这就是为什么在取出元素的时候是Object类型了!

java中泛型上限,下限应用的更多相关文章

  1. Java中泛型 类型擦除

    转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类 ...

  2. Java中泛型使用

    Java中泛型使用 泛型作用: 泛型:集合类添加对象不用强转 反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码: ArrayList<Ls> ff=new ArrayList ...

  3. Java中泛型的理解

    Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型.这种数据类型可以用在类.接口和方法创建中.即泛型类.泛型接口.泛型方法.这样说可能不够生动 ...

  4. Java 中 泛型的限定

         泛型 一般 出如今集合中,迭代器中 也会出现!      泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们经常使用的容器中.  越是 单一 约优点理啊!       ...

  5. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  6. Java 中泛型的全面解析(转)

    Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在J ...

  7. Java中泛型数组创建总结

    在java中,可以声明一个泛型数组,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size) ...

  8. Java中泛型Class<T>、T与Class<?>、 Object类和Class类、 object.getClass()和Object.class

    一.区别 单独的T 代表一个类型(表现形式是一个类名而已) ,而 Class<T>代表这个类型所对应的类(又可以称做类实例.类类型.字节码文件), Class<?>表示类型不确 ...

  9. Java中泛型区别以及泛型擦除详解

    一.引言 复习javac的编译过程中的解语法糖的时候看见了泛型擦除中的举例,网上的资料大多比较散各针对性不一,在此做出自己的一些详细且易懂的总结. 二.泛型简介 泛型是JDK 1.5的一项新特性,一种 ...

随机推荐

  1. android目录介绍

  2. 数据库、数据表的创建SP2

      本人前一个版本的数据库.数据表的创建由于不是很详细,于是通过细心的修订,已经修复了很多Bug,希望这篇文章能够给大家一些帮助 --代表注释,相当于C#里的// --切换到master数据库,目的是 ...

  3. maven清除不同版本的重复依赖

    pom文件加入: <dependencyManagement> <dependencies> <dependency> <groupId>org.spr ...

  4. 在已有 Xcode 项目中 加入Cordova框架

    转自:http://www.jianshu.com/p/656838ae92bc 我们知道,在UIKit中的UIWebView虽然已经提供了很多功能了,比如JavaScript和Objc之间的通信.但 ...

  5. Android中Button、ImageButton、ImageView背景设置区别

    Button与ImageButton实际两者无关,Button继承自TextView,不支持src;ImageButton继承自ImageView.同一张图片在不设置大小,默认显示时,使用Button ...

  6. day10---multiprocess 多进程

    multiprocess Queue  \ Pipe 只是实现进程间数据的传递 Manager 实现了进程间数据的共享,即多个进程可以修改同一份数据   进程模块 multiprocessing #! ...

  7. Python 之 lamda 函数

    1.例子 语法:lambda [args1,argus2....]:expression map(lambda x: x*x, [y for y in range(10)]) lambda:" ...

  8. JavaScript知识总结<一>

    JavaScript核心基础语法: 1.什么是JavaScript? 我们知道在Web标准中网页由:结构.形式.行为三部分组成:结构由标准形式XHTML.形式又标准形式CSS,那么行为的表现就由Jav ...

  9. linux-13基础命令之-touch,mkdir

    1.  touch 命令 用于创建空白文件与修改文件时间,格式:touch[选项][文件]: linux 下文件时间有三种 @1.更改时间(mtime):内容修改时间: @2.更改权限(ctime): ...

  10. unity 实现简单的分离

    在网上随便搜一搜资料就可以找到很多关于Mvc ,MVVM,StrangeIoc等有关显示与数据分离的博客,很多大神也是讲的蛮有道理的,但是这些框架理解起来有一定的难度, 这时候肯定有人说有现成的框架为 ...