黑马程序员技术交流社区
标题:
关于泛型比较器<<? super E>用法
[打印本页]
作者:
孙汇川
时间:
2012-2-19 12:03
标题:
关于泛型比较器<<? super E>用法
TreeSet 文档上写的是 TreeSet(Comparator<? super E> comparator)
比较器的泛型应该是任意类型或者其父类型,但是为什么<>中写Person类是,可以在TreeSet建立时比较Student和Worker类的对象?
虽然没有写<? super E>但是写Person也应该是比较Person本身或者其父类,为什么可以比较Person类的子类?那不跟<? extends E>的功能一样了吗?
另<? super E>什么时候用呢?
下面写个程序大家好明白我问问题的意思。
import java.util.*;
class GenericDemo7
{
public static void main(String[] args)
{
TreeSet<Student> ts = new TreeSet<Student>(new Comp());
ts.add(new Student("abc03"));
ts.add(new Student("abc02"));
ts.add(new Student("abc06"));
ts.add(new Student("abc01"));
Iterator<Student> it = ts.iterator();
while(it.hasNext())
{
System.out.println(it.next().getName());
}
/**/
TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());
ts1.add(new Worker("wabc--03"));
ts1.add(new Worker("wabc--02"));
ts1.add(new Worker("wabc--06"));
ts1.add(new Worker("wabc--01"));
Iterator<Worker> it1 = ts1.iterator();
while(it1.hasNext())
{
System.out.println(it1.next().getName());
}
}
}
class Comp implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
return p2.getName().compareTo(p1.getName());
}
}
class Person
{
private String name;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public String toString()
{
return "person :"+name;
}
}
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
复制代码
作者:
邱纲
时间:
2012-2-19 12:14
这是我的笔记,
你看一下,
泛型
几个术语:
ArrayList<E>中的E称为类型变量或类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<Integer>称为参数化的类型
ArrayList<Integer>中的Integer称为类型参数的实例或实际类型参数
ArrayList称为原始类型
<1>.泛型要注意的几个问题
1.参数化类型和原始类型互不兼容
2.参数化类型不考虑类型参数的继承关系
3.泛型不能应用于数组
<2>.泛型中的?通配符
使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数化无 关的方法,不能调用与参数化有关的方法。例如:不能调用ArrayList类的add()方法,但是可以调用 ArrayList类的size()方法。
<3>.泛型中的?通配符的扩展
1.限定通配符的上边界(即参数类型只能是这个类或者是继承这个类的子类):
示例:正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<Date>();
2.限定通配符的下边界:
示例:Vector<? super Integer> x = new Vector<Number>();
注:限定通配符总是包括自己。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2