class StuComp implements Comparator<? super Student>//源代码就是<Student>
{
public int compare(Student s1,Student s2)
{
return s1.getName().compareTo(s2.getName());
}
}
/*
class WorkerComp implements Comparator<Worker>
{
public int compare(Worker s1,Worker s2)
{
return s1.getName().compareTo(s2.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-7-14 07:30
你的代码太多,我就不全部复制了.有几个地方要改
修正后的:
class StuComp<T extends Person> implements Comparator<T>
{
public int compare(T s1,T s2)
{
return s1.getName().compareTo(s2.getName());
}
}
我想你的意图是要让这个比较器对Person的所有子类都可以进行比较吧?
你的代码:class StuComp implements Comparator<? super Student>
{
public int compare(Student s1,Student s2)
{
return s1.getName().compareTo(s2.getName());
}
}
TreeSet<Student> ts = new TreeSet<Student>(new StuComp<Student>());//调用比较器时,将实际类型Student传入.
1.你原来的泛型是限定为Person的父类,但是你想想,Object是不是Person的父类呢?Object怎么会有Person的getName方法?编译器也意识到这点,所以不让你通过.
2.如果你在泛型类中需要用到传入类型对象的方法时,就不要用通配符?了,而是用一个大写字母表示类型参数.
3.如果泛型需要限定类型,就在类名后面完成这个动作,然后将类型参数传给接口,貌似接口不接收限定类型参数,这点我也要找找资料.
改过以后,我编译了一次,是成功的.
亲,记得给好评哦~{:soso_e112:} 作者: 刘源 时间: 2012-7-14 10:18
谢谢楼上了。明白了