5

いくつかの抽象クラスがあり、それぞれが 3 つまたは 4 つの具象クラスをスーパークラス化し、次の形式になっています。

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)ArrayListCollections.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ジェネリックを実際に使用したのはこれが初めてで、多かれ少なかれランダムに物事を試す段階に達しました。私はチュートリアルを読んでいますが、これまでのところ、私が間違っていることを単に「クリック」していません。

編集: さまざまな抽象クラスの各サブクラスは、互いに比較可能である必要があります。したがって、抽象クラスなどがある場合TypeofMapObject1TypeOfMapObject21 のサブクラスを 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()整数、日付など、比較可能なものであれば何でもかまいません。

于 2013-07-29T05:29:07.963 に答える