Java 泛型在API中的体现

本文介绍Java中泛型的上限和下限概念,并通过TreeSet集合实例展示如何使用泛型上限实现类型的安全添加,以及如何利用泛型下限定义灵活的比较器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 首先创建Person类和两个子类 Worker类和Student类

/* person 类*/

public class Person implements Comparable<Person> {
private String name;
private int age;


public Person() {
super();
}

public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}

       // 省略 getter 和 setter方法

@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}

@Override
public int compareTo(Person o) {   // 按年龄排序
int temp = this.age - o.age;
return temp == 0 ? this.name.compareTo(o.name) : temp;
}

}

/* student 类 */

public class Student extends Person {


public Student() {
super();
}

public Student(String name, int age) {
super(name, age);
}

@Override
public String toString() {
return "Student [name()=" + getName() + ", age()=" + getAge() + "]";
}
}


/* worker 类 */

public class Worker extends Person {

public Worker() {
super();
}

public Worker(String name, int age) {
super(name, age);
}

@Override
public String toString() {
return "Worker [name()=" + getName() + ", age()=" + getAge()+ "]";
}
}

/** -------------------------------------------------泛型上限的体现--------------------------------------------------------*/

/**
 * @作者 atyang
 * 
 *      TreeSet(Collection<? extends E> c) :上限的体现,,类型可以是 E或E的子类型
 */
public class UpDemo {

public static void main(String[] args) {

// 创建一个collection集合
// Collection<Person> c = new ArrayList<Person>();
// c.add(new Person("lisi", 18));
// c.add(new Person("aangwu", 23));

Collection<Student> c2 = new ArrayList<Student>();
c2.add(new Student("lisi", 18));
c2.add(new Student("aangwu", 23));

/*
* TreeSet 集合在创建时就将 c 存入TreeSet集合中

* TreeSet 集合中传入的Collection集合存储的元素类型可以是 Person ,也可以是 person的子类型
* TreeSet<T> person = new TreeSet<T>(Collection<? extends T> c);
*/
TreeSet<Person> person = new TreeSet<Person>(c2);       // c2 即满足 Collection<? extends T>
person.add(new Person("zhangsan", 21));


for (Iterator<Person> it = person.iterator(); it.hasNext();) {
Person person2 = it.next();
System.out.println(person2);
}
}
}

/*
  class TreeSet<E> {
      TreeSet<E>(Collection<? extends E> c){ }
  }
 */

/**----------------------------------------------------------------泛型下限的体现----------------------------------------------*/

/**
 * @作者 at杨
 * 
 *     泛型中下限在 API中的体现 TreeSet(Comparator<? super E> comparator),,常用在比较器中
 */
public class DownDemo {

public static void main(String[] args) {

// 创建一个集合存储的是学生对象,按姓名排序
/*
* TreeSet 集合在创建时传入一个比较器,
* 比较器的参数类型可以是该集合的参数类型,也可以定义为该集合参数类型的父类类型
*  
* TreeSet<T> person = new TreeSet<T>(Comparator<? super T> c);
*/
TreeSet<Student> stu = new TreeSet<Student>(new comparaByName());
stu.add(new Student("aaa", 18));
stu.add(new Student("aab", 21));
stu.add(new Student("abcc", 23));

for (Iterator<Student> it = stu.iterator(); it.hasNext();) {
Student ts = it.next();
System.out.println(ts);
}

// 让工人按姓名排序
TreeSet<Worker> wok = new TreeSet<Worker>(new comparaByName());
wok.add(new Worker("aaa", 18));
wok.add(new Worker("aab", 22));
wok.add(new Worker("abcc", 23));

for (Iterator<Worker> it = wok.iterator(); it.hasNext();) {
Worker wo = it.next();
System.out.println(wo);
}
}
}

/*
 * 以下两个比较器,都是按照姓名进行排序,就是类型不同,一个是Student,一个是Worker 既然使用的都是
 * Person的内容,为什么不定义一个 Person 的比较器?
 */
class comparaByName implements Comparator<Person> {

@Override
public int compare( Person o1 ,  Person o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp == 0 ? o1.getAge() - o2.getAge() : temp;
}
}
// 定义一个比较器,排序学生
/*
class comparaByName implements Comparator<Student> {

@Override
public int compare(Student o1, Student o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp == 0 ? o1.getAge() - o2.getAge() : temp;
}
}
*/

// 定义一个比较器,排序工人
/*
class comparaWorkByName implements Comparator<Worker> {

@Override
public int compare(Worker o1, Worker o2) {
int temp = o1.getName().compareTo(o2.getName());
return temp == 0 ? o1.getAge() - o2.getAge() : temp;
}

}

*/

/*
 TreeSet<E>{ 
  TreeSet<E>(Comparator(? super E)){ };
}
 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值