web-dev-qa-db-fra.com

MyClass ne peut pas être converti en Java.lang.Comparable: Java.lang.ClassCastException

Je fais un projet Java et j'ai ce problème et je ne sais pas comment le résoudre.

Les cours de mon projet (simplifiés): 

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;

    }  
}

Ensuite, j'essaie de trier une ArrayList de Stock afin de créer une autre classe appelée CompareByValue

public class CompareByValue implements Comparator<Stock> {

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

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

    }

}

Quand j'essaye de lancer le programme, ça donne l'erreur:

Exception dans le thread "principal" Java.lang.ClassCastException: le stock ne peut pas être converti en Java.lang.Comparable.

Quelqu'un sait ce qui ne va pas?

8
user2234225

C'est parce que Stock n'implémente pas Comparable. Soit l'implémenter:

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

... ou passez une instance de CompareByValue en tant que paramètre à la méthode sort() :

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

seulement du code ci-dessus, ça a l'air bien. Êtes-vous sûr que l'exception du code ci-dessus? si vous venez de mettre un objet Stock dans n’importe quelle collection triée, vous verrez cette exception et devrez implémenter une interface comparable. 

Mais dans le cas où il suffit de passer votre comparateur personnalisé, vous n'avez pas besoin de faire en sorte que Stock soit comparable. c'est le même cas que vous donnez l'implémentation anonyme du comparateur. 

définissez votre comparateur sur une collection triée comme TreeSet, puis ajoutez l'objet stock à la collection triée; cela devrait fonctionner sans implémenter une interface comparable.

0
Steve Park