zoukankan      html  css  js  c++  java
  • java中泛型上限,下限应用

    v 一.程序中无形之中用到的泛型
    import java.util.*;
    class Person implements Comparable<Person>{
       String name;
       int age;
       Person(){
           name = "";
           age = 0;
       }
       Person(String name, int age){
           this.name = name;
           this.age = age;
       }
       public String toString(){
           return name + "...." + age;
       }
       
     
       public int compareTo(Person o){
           
           if(name.compareTo(o.name)==0)
              return o.age - age;
           return o.name.compareTo(name);
       }
    }
    
    class Student extends Person{
         int score;
         public Student(){
             super();
         }
         public Student(String name, int age, int score){
             super(name, age);
             this.score = score;
         }
         
         public String toString(){
             return  name + "...." + age + "...." + "score: " + score;
         }
    }
    
    class Worker extends Person{
         int salary;
         public Worker(){
             super();
         }
         public Worker(String name, int age, int salary){
             super(name, age);
             this.salary = salary;
         }
         
         public String toString(){
             return  name + "...." + age + "...." + "salary: " + salary;
         }
    }
    
    class ComparatorPerson implements Comparator<Person>{
         public int compare(Person o1, Person o2){
             if(o1.name.compareTo(o2.name)==0)
                return o1.age - o2.age;
             return o1.name.compareTo(o2.name);
         }
    }
         
    public class Test{
       public static void main(String[] args){
           ArrayList<Person> arr = new ArrayList<Person>();
           arr.add(new Person("hujunzheng", 22));
           arr.add(new Person("caihaibin", 21));
           arr.add(new Person("huangweidong", 22));
           
           ArrayList<Student> arr1 = new ArrayList<Student>();
           arr1.add(new Student("hujunzheng", 22, 500));
           arr1.add(new Student("caihaibin", 21, 444));
           arr1.add(new Student("huangweidong", 22, 777));
           
           ArrayList<Worker> arr2 = new ArrayList<Worker>();
           arr2.add(new Worker("789", 22, 500));
           arr2.add(new Worker("465", 21, 444));
           arr2.add(new Worker("798", 22, 777));
           
           //public boolean addAll(Collection<? extends E> c)// 泛型的上限:用于存储的数据
           // 如果不是<? extends E> 而只是<E> 那么E的子类型就不能加载进来!因为Collection<Person> 和 ArrayList<Student>泛型管理的不是同一数据类型
           // 而 <? extends E> 要求传进来的对象实例管理的泛型只要是 E 或者是 E的子类都行!
           arr.addAll(arr1);
           arr.addAll(arr2);
           
           Object[] oo = null;
           Arrays.sort(oo=arr.toArray());
           for(Object o : oo)
              System.out.println(o);
              
           //public TreeSet(Comparator<? super E> c); 传递的是比较泛型为 E 或者是 E的父类的比较器
           //在进行 E类型两个数据比较的时候, 用 E类 或者 E类型的父类型进行接收,并使用 ?类型的定义的比较方式!
           
           System.out.println("泛型上限,下限...................................................");
           TreeSet<Worker> tw = new TreeSet<Worker>(new ComparatorPerson());// E 是 Worker, 传递的是其父类Person的比较器
           tw.addAll(arr2);
           
           for(Iterator it = tw.iterator(); it.hasNext(); )
              System.out.println(it.next());
           
           TreeSet<Student> ts= new TreeSet<Student>(new ComparatorPerson());// E 是 Student, 传递的是其父类Person的比较器
           ts.addAll(arr1);
           
           for(Object o : ts.toArray())
              System.out.println(o);
           //上述的Worker 和 Student在TreeSet中排序时使用的比较器都是Person类实现的比较器
       }
    }
      
    v 二.简单的理解
    ArrayList<Person> alist = new ArrayList<Person>();
    ArrayList<? extends Person> list = new ArrayList<Student>();
    alist.addAll(list);
    Person p = new Person();
    Student s = new Student();
    //compile error
    list.add(p);或者 list.add(s);

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

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

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

  • 相关阅读:
    MyBatis初学者配置
    hibernate错题解析
    Hibernate二级缓存配置
    Open Session In View
    Hibernate延迟加载Lazy
    ThreadLocal
    HQL基础查询语句
    Hibernate中saveOrUpdate()和merge()的区别
    springmvc的类型转换
    springmvc的初始化参数绑定
  • 原文地址:https://www.cnblogs.com/hujunzheng/p/3872633.html
Copyright © 2011-2022 走看看