java中泛型上限,下限应用

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类实现的比较器
   }
}

  

java中泛型上限,下限应用

时间: 2025-01-10 10:02:58

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

Java 中 泛型的限定

泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中,  越是 单一 约好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 泛型的限定上限: <? extends E> 接受 E 或者 E 的子类型. 泛型的限定下限: <?  super   E>  接收  E 或者 E 的父类. 泛型的限定上限 (定义父类 填装子类 类型!) 代码: package stu.love.v; import java

Java中泛型 使用

泛型: 1.5  之后出现  提高安全 1      泛型 确定 集合容器的类型. 2      <> 接收一种数据类型,(引用数据类型) ArrayList<String> lis = new ArrayList<String>() 目的: 将运行时期的 错误 转化到 编译时期,提高了安全性! 3      不需要 强制类型转换.  更加安全! 泛型的 擦除: 泛型在编译时期使用!使用完毕直接擦除. 编译完的时候 不存在 泛型. 好处: 使用了 泛型,不自需要强制类型

Java中泛型 类型擦除

转自:Java中泛型是类型擦除的 Java 泛型(Generic)的引入加强了参数类型的安全性,减少了类型的转换,但有一点需要注意:Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉,看下面一个列子,代码如下: public class Foo { public void listMethod(List<String> stringList){ } public void listMethod(List<Integer> intList) {

Java中泛型的理解

Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型.这种数据类型可以用在类.接口和方法创建中.即泛型类.泛型接口.泛型方法.这样说可能不够生动,来举些例子说明一下. 例子一 我们通过 例子一 来简单看看泛型的应用场景.下面的情况中,没有使用泛型: public class FanXingTest { public static void main(String[] args) { ArrayList arrayList = new Arr

Java中泛型的协变

在工作中遇到一个问题,用代码描述如下: package test; import java.util.LinkedList; import java.util.List; public class ListTest {     public void func(List<Base> list) {     }     public static void main(String args[]) {         ListTest lt = new ListTest();         Li

Java 中泛型的全面解析

Java泛型(generics) 是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误.而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的

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

泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通过代码也可以看出来,我们放入其他类型时,如字符串,编译器不会报错,但是运行程序时会抛出类型错误异常,这样给开发带来很多不方便,用泛型就解决了这个麻烦 泛型规定了某个集合只能存放特定类型的属性,当添加类型与规定不一致时,编译器会直接报错,可以清楚的看到错误 当我们从List中取出元素时直接取出即可,不

Java中泛型的介绍与简单使用

学习目标 掌握泛型的产生意义. 掌握泛型的基本使用. 了解泛型的警告信息及泛型的擦除. 泛型是在JDK1.5之后增加的内容,泛型(Generic) 使用泛型的原因 题目分析: 首先要考虑到,必须建立一好一个表示坐标点的类--Point,此类中有两个属性分别用来表示x坐标和y坐标,但是x和y中所保存的整数类型会有三种(int.float.String),而要想使用一个类型可以同时接收这样的三种类型数据,现在只能使用Object,因为Object类可以接收任何类型的数据,都会自动发生向上转型操作,这

Java中泛型数组创建总结

在java中,可以声明一个泛型数组,不能通过直接通过T[] tarr=new T[10]的方式来创建数组,最简单的方式便是通过Array.newInstance(Classtype,int size)的方式来创建数组例如下面的程序. public class ArrayMaker<T> { private Class<T> type; public ArrayMaker(Class<T> type) { this.type = type; } @SuppressWarn