Java使用Comparator

时间:2014-07-16 12:56:42

标签: java comparator comparable

我正在我的班级Employee中实现Comparator和Comparable来对一个arraylist进行排序。我正在排序2参数名称和ID。使用Collections.sort(Employee ob1,Employee ob2)使用ID进行排序时,它不起作用。我得到编译错误,该类没有声明为abstact,我没有重写compare(),虽然我这样做:

public int compare(Employee ob1, Employee ob2)
{
return ob1.id-ob2.id;
}

如果我使用

,它可以正常工作
public int compare(Object ob1, Object ob2)
{
return ((Employee)ob1).id-((Employee)ob2).id;
}

我怀疑的是,为什么早期的工作不起作用,因为Employee也是一个Object。 同样的问题也是compareTo(Object ob),虽然重写为什么我不能直接使用Employee,为什么我需要在那里使用Object,以后需要将它转换为Employee类。

2 个答案:

答案 0 :(得分:5)

使用Object,Object的多态性覆盖Comparator中的原始类型。使用您的类名称与该签名不匹配。对于混合签名时的编译错误,请使用模板类型。

public class Employee implements Comparator<Employee> {
  // ....
  @Override
  public int compare(Employee ob1, Employee ob2) {
    return ob1.id-ob2.id;
  }
}

答案 1 :(得分:0)

您需要实现接口定义的确切方法。 如果您想直接使用对象,请使用&lt;&gt;通用语法:

public class Employee implements Comparator<Employee> 
{
   @Override
   public int compare(Employee ob1, Employee ob2) 
   {
      return ob1.id - ob2.id;
   }

}

请务必使用@ Override Annotation。如果你得到错误的方法(参数,返回值等),这将给你一个编译器警告

使用Comparable时,您可以像这样使用它:

public class Employee implements Comparable<Employee> 
{
   @Override
   public int compareTo(Employee e) 
   {
      //your compare code
   }
}

另请参阅:Comparable vs Comparator