Java - Collection.Sort over Interface Objects

时间:2013-07-29 05:24:10

标签: java sorting generics comparable

我有一些抽象类,每个类都超级分类三到四个具体的类和形式:

public abstract class TypeOfMapObject extends IrrelevantClass implements Serializable, MapObject, Comparable<MapObject>
{
  //irrelevant stuff
  @Override
  public int compareTo(MapObject m)
  {
    //specific algorithm for natural ordering
  }
}

在我的代码的其他地方,我有ArrayList<MapObject>(正确填充,我已经检查过),名为tempMapObjectsArray我希望使用ArrayListCollections.sort(tempMapObjectsArray)进行排序(或者更确切地说,我想对ArrayList进行排序,似乎Collections.sort()是最好的方法。排序的具体方式并不重要。)

它没有编译和发送消息(在Netbeans中):

no suitable method found for sort(java.util.ArrayList<Model.MapObject>)
 method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
 (cannot instantiate from arguments because actual and formal argument lists differ in length)
 method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
  (inferred type does not conform to declared bound(s)
   inferred: Model.MapObject
   bound(s): java.lang.Comparable<? super Model.MapObject>)

似乎我在TypeOfMapObject类中定义了一般错误,但这是我第一次真正使用泛型并且它已经达到了我或多或少随意尝试的阶段。我正在阅读tutorial,但到目前为止,它根本就不是“点击”我做错了什么。

编辑:各种抽象类的每个子类需要相互比较 - 所以如果我有抽象类TypeofMapObject1TypeOfMapObject2等,那么我需要能够比较一个子类1到2的子类。

1 个答案:

答案 0 :(得分:10)

将Comparable类型与类匹配:

public abstract class TypeOfMapObject extends IrrelevantClass implements Serializable, MapObject, Comparable<TypeOfMapObject> {
    @Override
    public int compareTo(TypeOfMapObject m)
    {
        //specific algorithm for natural ordering
    }
}

或者只是不在抽象类中定义compareTo方法 - 留下它来实现子类。


解决编辑问题:

如果要比较不同的子类型,请让它们实现一个返回值(比如String)的方法,用它们进行比较。例如:

public abstract class TypeOfMapObject extends IrrelevantClass implements Serializable, MapObject, Comparable<TypeOfMapObject> {
    @Override
    public int compareTo(TypeOfMapObject m)
    {
        return compareValue().compareTo(m.compareValue());
    }

    // subclasses to return their value to compare
    protected abstract String compareValue();
}

compareValue()返回的类型可以是任何可比较的类型,例如Integer,Date等等。