5

我有许多抽象类,每个抽象类都继承了三个或四个具体的类,其形式为:

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 我想ArrayList使用排序Collections.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课堂上定义了泛型错误,但这是我第一次真正使用泛型,并且已经到了我只是或多或少随机尝试的阶段。我正在阅读本教程,但到目前为止,它根本没有“点击”我做错了什么。

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

4

1 回答 1

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 方法 - 将其留给子类来实现。


要解决问题的编辑:

如果你想比较不同的子类型,让它们实现一个返回值(比如字符串)的方法,可以将它们与之进行比较。例如:

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 等等。

于 2013-07-29T05:29:07.963 回答