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,如需转载请自行联系原作者
目录
相关文章
|
22天前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
|
17天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
19天前
|
缓存 Java 物联网
CRaC技术助力ACS上的Java应用启动加速
容器计算服务借助ACS的柔性算力特性并搭配CRaC技术极致地提升Java类应用的启动速度。
|
19天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
2月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
223 9
|
2月前
|
Java 应用服务中间件 API
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
55 5
|
2月前
|
人工智能 自然语言处理 搜索推荐
【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式
本文介绍了如何将Java与AIGC(人工智能生成内容)技术结合,实现智能文本生成。
233 5
|
2月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis,从基础到高级的深度细节应用
本文详细介绍了MyBatis,一个轻量级的Java持久化框架。内容涵盖MyBatis的基本概念、配置与环境搭建、基础操作(如创建实体类、Mapper接口及映射文件)以及CRUD操作的实现。此外,还深入探讨了高级特性,包括动态SQL和缓存机制。通过代码示例,帮助开发者更好地掌握MyBatis的使用技巧,提升数据库操作效率。总结部分强调了MyBatis的优势及其在实际开发中的应用价值。
42 1
|
3月前
|
安全 算法 Java
Java CAS原理和应用场景大揭秘:你掌握了吗?
CAS(Compare and Swap)是一种乐观锁机制,通过硬件指令实现原子操作,确保多线程环境下对共享变量的安全访问。它避免了传统互斥锁的性能开销和线程阻塞问题。CAS操作包含三个步骤:获取期望值、比较当前值与期望值是否相等、若相等则更新为新值。CAS广泛应用于高并发场景,如数据库事务、分布式锁、无锁数据结构等,但需注意ABA问题。Java中常用`java.util.concurrent.atomic`包下的类支持CAS操作。
107 2
|
3月前
|
监控 Java 数据库连接
Java线程管理:守护线程与用户线程的区分与应用
在Java多线程编程中,线程可以分为守护线程(Daemon Thread)和用户线程(User Thread)。这两种线程在行为和用途上有着明显的区别,了解它们的差异对于编写高效、稳定的并发程序至关重要。
75 2