为什么我们不能在类中有多个compareTo函数,就像我们可以有多个比较函数一样?

时间:2014-10-10 12:47:58

标签: java comparator comparable

import java.util.Comparator;
class Student implements Comparable<Student>
{
    private int rn;
    private float cg;
    private String name;
    public Student(int num, float cgpa, String nm)
    {
        rn = num; cg = cgpa; name = nm;
}
public int getrn()
{   return rn;
}
public float getcg()
{   return cg;
}
public String getname()
{   return name;
}
public static class orderbyrn implements Comparator<Student>
{
    @Override
    public int compare(Student obj1, Student obj2)
    {
        return obj1.rn>obj2.rn? 1 : (obj1.rn<obj2.rn? -1 : 0 );
    }
}
public static class orderbycg implements Comparator<Student>
{
    @Override
    public int compare(Student obj1, Student obj2)
    {
        return obj1.cg>obj2.cg? 1 : (obj1.cg<obj2.cg? -1 : 0 );
    }
}
/*  NOTE THIS FAILS TO COMPILE!
public static class testingcomparable implements Comparable<Student>
{
    @Override
    public int compareTo(Student obj)
    {
        return cg>obj2.cg? 1 : (cg<obj2.cg? -1 : 0 );
    }
}
*/
@Override
public int compareTo(Student obj2)  //while overriding types have to be compatible ie either same or related by inheritance
{
    return rn>obj2.rn? 1 : (rn<obj2.rn? -1 : 0 );
}
public String toString()
{
    return rn+name+cg;
}
}

显示的错误是: &#34;非静态变量cg不能从静态上下文引用&#34; 我被卡住了。任何帮助将非常感激。谢谢。 请原谅我,如果我不够清楚的话。第一次发帖提问! :d

2 个答案:

答案 0 :(得分:0)

它失败是因为您在嵌套的静态类cg中引用了Student类的testingcomparable字段 - 它无法看到Student的实例字段}类。 orderbycg有效,因为它引用了对象cgobj1上的obj2字段。

答案 1 :(得分:0)

ComparableComparator之间的本质区别在于,前者为类定义 自然顺序 。请注意该句中的定冠词:只能有一个自然顺序。另一方面,您可以多次实施Comparator来定义同一类别的其他仲裁订单。

请注意以上方法如何反映在方法签名中:compareTo()只接受另一个对象,假设this为左侧。您试图在单独的类中实现它,其中this未引用Student,这是您的代码无法编译的直接原因。