黑马程序员技术交流社区
标题:
关于高级泛型下限的问题
[打印本页]
作者:
王飚
时间:
2013-10-15 19:21
标题:
关于高级泛型下限的问题
本帖最后由 王飚 于 2013-10-16 18:02 编辑
/*
泛型的限定2
下限<? super E>
关于老师在视屏中的讲解,说这个例子是泛型下限的例子。
但是泛型的下限不是<? super E>也就是子类对象是确定啊,
但是在这个例子中的比较器Comp却是Person(父类)的类型,
这点我很迷惑,求解答
*/
import java.util.*;
class GenericDemo_6
{
public static void main(String[] args)
{
TreeSet<Student> ts1= new TreeSet<Student>(new Comp());
ts1.add(new Student("ab01"));
ts1.add(new Student("ab03"));
ts1.add(new Student("ab02"));
ts1.add(new Student("ab04"));
Iterator it1=ts1.iterator();
while(it1.hasNext())
{
System.out.println(it1.next());
}
TreeSet<Worker> ts= new TreeSet<Worker>(new Comp());
ts.add(new Worker("ab---w01"));
ts.add(new Worker("ab---w03"));
ts.add(new Worker("ab---w02"));
ts.add(new Worker("ab---w04"));
Iterator it=ts.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public String toString()
{
return "Person"+name;
}
}
//定义父类类型的比较器就可以传入不同的子类对象了
class Comp implements Comparator<Person>
{
public int compare(Person p1,Person p2)
{
return p2.getName().compareTo(p1.getName());//倒序
}
}
/*
//比较器
发现这样写比较麻烦,因为每要存储一个对象都要写一个新的比较器
class WorkComp implements Comparator<Worker>
{
public int compare(Worker s1,Worker s2)
{
return s1.getName().compareTo(s2.getName());
}
}
//Worker的比较器
class Comp implements Comparator<Worker>
{
public int compare(Worker s1,Worker s2)
{
return s1.getName().compareTo(s2.getName());
}
}
*/
class Student extends Person
{
Student(String name)
{
super(name);
}
}
class Worker extends Person
{
Worker(String name)
{
super(name);
}
}
复制代码
作者:
天下
时间:
2013-10-16 00:16
本帖最后由 天下 于 2013-10-16 00:17 编辑
在集合TreeSet(Comparator<? super E> comparator) 构造方法中,是可以传E和E的父类型
但是在你的代码中,TreeSet()传比较器的时候并未指定泛型
如果你传:new comp<?super person>,那么该集合只接受person类或者person的父类类型
作者:
王飚
时间:
2013-10-16 12:36
天下 发表于 2013-10-16 00:16
在集合TreeSet(Comparator
嗯,谢谢你的回答,但在本实例中,TreeSet<?>中泛型的父类是Person,那么也就是说父类是固定的,那么是不是理解为是上限的例子会更好一些,也就是<? extends Person>?
作者:
oath
时间:
2013-10-16 15:54
本帖最后由 oath 于 2013-10-16 16:02 编辑
那要看你怎么定义比较器了,
如果定义比较器时就明确类型参数的话,实例化比较器就和泛型没有关系了
就如同你上面写的那样
还有一种情况是定义比较器时不明确类型参数,在实例化比较器的时候就要明确类型参数,明确类型参数时可以使用通配符<? super T>这样的形式作为类型参数。
举个例子
class Com<T> implements Comparator<T>{
@Override
public int compare(T o1, T o2) {
// TODO Auto-generated method stub
return 0;
}
}
复制代码
创建对象的时候就是这样
Com<? super Student> comparator = new Com<Person>();
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2