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类型了!
目录
相关文章
|
2月前
|
Java API
[Java]泛型
本文详细介绍了Java泛型的相关概念和使用方法,包括类型判断、继承泛型类或实现泛型接口、泛型通配符、泛型方法、泛型上下边界、静态方法中使用泛型等内容。作者通过多个示例和测试代码,深入浅出地解释了泛型的原理和应用场景,帮助读者更好地理解和掌握Java泛型的使用技巧。文章还探讨了一些常见的疑惑和误区,如泛型擦除和基本数据类型数组的使用限制。最后,作者强调了泛型在实际开发中的重要性和应用价值。
30 0
[Java]泛型
|
2月前
|
存储 安全 Java
🌱Java零基础 - 泛型详解
【10月更文挑战第7天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
18 1
|
2月前
|
Java 语音技术 容器
java数据结构泛型
java数据结构泛型
27 5
|
3月前
|
Java 编译器 容器
Java——包装类和泛型
包装类是Java中一种特殊类,用于将基本数据类型(如 `int`、`double`、`char` 等)封装成对象。这样做可以利用对象的特性和方法。Java 提供了八种基本数据类型的包装类:`Integer` (`int`)、`Double` (`double`)、`Byte` (`byte`)、`Short` (`short`)、`Long` (`long`)、`Float` (`float`)、`Character` (`char`) 和 `Boolean` (`boolean`)。包装类可以通过 `valueOf()` 方法或自动装箱/拆箱机制创建。
43 9
Java——包装类和泛型
|
2月前
|
存储 Java 编译器
Java集合定义其泛型
Java集合定义其泛型
19 1
|
2月前
|
存储 Java 编译器
【用Java学习数据结构系列】初识泛型
【用Java学习数据结构系列】初识泛型
22 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
3月前
|
存储 安全 搜索推荐
Java中的泛型
【9月更文挑战第15天】在 Java 中,泛型是一种编译时类型检查机制,通过使用类型参数提升代码的安全性和重用性。其主要作用包括类型安全,避免运行时类型转换错误,以及代码重用,允许编写通用逻辑。泛型通过尖括号 `&lt;&gt;` 定义类型参数,并支持上界和下界限定,以及无界和有界通配符。使用泛型需注意类型擦除、无法创建泛型数组及基本数据类型的限制。泛型显著提高了代码的安全性和灵活性。
|
2月前
|
安全 Java 编译器
Java基础-泛型机制
Java基础-泛型机制
17 0
|
2月前
|
Java
【Java】什么是泛型?什么是包装类
【Java】什么是泛型?什么是包装类
20 0