-2

私はこの方法を持っています:

private SortedMap<String, SpaceObjectImpl> catalog = new TreeMap<String, SpaceObjectImpl>();

public Collection<SpaceObject> getSpaceObjects(){
    SortedSet<SpaceObject> temp = new TreeSet<SpaceObject>(catalog.values());
    return temp;
}

一方、compareTo は次のように定義されています。

public int compareTo(SpaceObjectImpl s){
    ....
}

class SpaceObjectImpl implements SpaceObject

プログラムを実行するClassCastExceptionと、スローされます。理由はありますか?

エラー:

SpaceObjectImpl cannot be cast to java.lang.Comparable(in TreeMap)
4

5 に答える 5

1

SpaceObjectImpl実装する必要がありますComparable<SpaceObjectImpl>

于 2012-12-18T10:43:26.713 に答える
0

compareTo メソッドは Comparable で定義されており、TreeMap で使用するためにカスタム クラスがオーバーライドする必要があります。カスタム クラスに同等のインターフェイスを実装してください。

于 2012-12-18T10:37:05.580 に答える
0

独自のcompareTo()メソッドを記述しました。独自に作成する必要がありますcompareTo()が、オーバーライドする必要があります。つまり、クラスは実装する必要がありますComparable

このインターフェースを実装するオブジェクトのリスト (および配列) は、Collections.sort (および Arrays.sort) によって自動的にソートできます。

于 2012-12-18T10:37:40.527 に答える
0

ソートされたすべてのデータ構造/コレクション、ソートはそのcompareToメソッドに応じて行われます。あなたの場合、オブジェクトはユーザー定義であるため、デフォルトではそのクラスにcompareToメソッドはありません。を実装する必要があります

 Comparable 

ソート基準ロジックに従って、そのcompareToメソッドをオーバーライドします。

詳細については、http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/を参照してください。

これが役立つことを願っています。

于 2012-12-18T10:39:24.740 に答える
-1

インターフェイスSpaceObjectImpl を実装する必要がありComparableます。

以下は、この概念を説明する mkyong による例です。

public class Fruit implements Comparable<Fruit>{

    private String fruitName;
    private String fruitDesc;
    private int quantity;

    public Fruit(String fruitName, String fruitDesc, int quantity) {
        super();
        this.fruitName = fruitName;
        this.fruitDesc = fruitDesc;
        this.quantity = quantity;
    }

    public String getFruitName() {
        return fruitName;
    }
    public void setFruitName(String fruitName) {
        this.fruitName = fruitName;
    }
    public String getFruitDesc() {
        return fruitDesc;
    }
    public void setFruitDesc(String fruitDesc) {
        this.fruitDesc = fruitDesc;
    }
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int compareTo(Fruit compareFruit) {

        int compareQuantity = ((Fruit) compareFruit).getQuantity(); 

        //ascending order
        return this.quantity - compareQuantity;

        //descending order
        //return compareQuantity - this.quantity;

    }   
}

ここで、FruitクラスはComparabletype as のインターフェイスを実装し、メソッドFruitも持っていoverriden compareToます。

于 2012-12-18T10:32:21.727 に答える