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类型了!










本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/3872633.html,如需转载请自行联系原作者
目录
相关文章
|
3天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
21 0
|
1天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
2天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
15 0
|
3天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
8天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
|
8天前
|
设计模式 算法 Java
Java中的设计模式及其应用
【4月更文挑战第18天】本文介绍了Java设计模式的重要性及分类,包括创建型、结构型和行为型模式。创建型模式如单例、工厂方法用于对象创建;结构型模式如适配器、组合关注对象组合;行为型模式如策略、观察者关注对象交互。文中还举例说明了单例模式在配置管理器中的应用,工厂方法在图形编辑器中的使用,以及策略模式在电商折扣计算中的实践。设计模式能提升代码可读性、可维护性和可扩展性,是Java开发者的必备知识。
|
8天前
|
安全 Java API
函数式编程在Java中的应用
【4月更文挑战第18天】本文介绍了函数式编程的核心概念,包括不可变性、纯函数、高阶函数和函数组合,并展示了Java 8如何通过Lambda表达式、Stream API、Optional类和函数式接口支持函数式编程。通过实际应用案例,阐述了函数式编程在集合处理、并发编程和错误处理中的应用。结论指出,函数式编程能提升Java代码的质量和可维护性,随着Java语言的演进,函数式特性将更加丰富。
|
9天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
14天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
17 1
探秘jstack:解决Java应用线程问题的利器
|
4月前
|
Java Go
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项