web-dev-qa-db-ja.com

MyClassをJava.lang.Comparableにキャストできません:Java.lang.ClassCastException

私はJavaプロジェクトをやっていて、この問題を抱えていて、それを修正する方法がわかりません。

私のプロジェクトのクラス(簡略化):

public class Item {

    private String itemID;
    private Integer price;

    public Integer getPrice() {

        return this.price;

    }

}

public class Store {

    private String storeID;
    private String address;

}

public class Stock {

    private Item item;
    private Store store;
    private Integer itemCount;

    public Integer getInventoryValue() {

        return this.item.getPrice() * this.itemCount;

    }  
}

次に、ストックのArrayListをソートして、CompareByValueという別のクラスを作成します

public class CompareByValue implements Comparator<Stock> {

    @Override
    public int compare(Stock stock1, Stock stock2) {

        return (stock1.getInventoryValue() - stock2.getInventoryValue());

    }

}

プログラムを実行しようとすると、エラーが発生します。

スレッド「メイン」の例外Java.lang.ClassCastException:ストックはJava.lang.Comparableにキャストできません

誰が何が悪いのか知っていますか?

8
user2234225

StockComparableを実装していないためです。それを実装するか:

_public class Stock implements Comparable<Stock> {
    public int compareTo(Stock o) {
        // ...
    }
}
_

...または、パラメータとしてCompareByValueのインスタンスを sort() メソッドに渡します。

_Collections.sort(list, new CompareByValue());
_
12
Óscar López

上記のコードからのみ、それはうまく見えます。上記のコードからの例外は確かですか? Stockオブジェクトをソートされたコレクションに入れただけでは、そのような例外が発生し、Comparableインターフェースを実装する必要があります。

ただし、カスタムコンパレータを渡すだけの場合は、ストックを比較可能にする必要はありません。あなたが匿名のコンパレータ実装を与えるのと同じケースです。

コンパレータをTreeSetのようなソートされたコレクションに設定し、ストックオブジェクトをソートされたコレクションに追加すると、Comparableインターフェースを損なわずに機能するはずです。

0
Steve Park
public class Student implements Comparator<Student> {

                private String name;
                private String surname;
                private int matpaz;
                private int progrpaz;
                private int anglupaz;
                private double average;

            @Override
                public int compare(Student o1, Student o2) {

                    String v1 = o1.surname;
                    String v2 = o2.surname;

                    if ((v1.compareTo(v2)) >0) return 1;
                    else return 0;
                }


                public static void alphabetically (Student[] s)
                {
                    Arrays.sort(s); 
                    System.out.printf(Arrays.toString(s));
                } 
}
0
barkman345