MyClass无法强制转换为java.lang.Comparable:java.lang.ClassCastException

时间:2013-10-31 21:18:38

标签: java sorting exception classcastexception comparable

我正在做一个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());

    }

}

当我尝试运行程序时,会出现错误:

  

线程“main”中的异常java.lang.ClassCastException:Stock无法强制转换为java.lang.Comparable

任何人都知道什么是错的?

3 个答案:

答案 0 :(得分:12)

这是因为Stock没有实施Comparable。实现它:

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

...或者将CompareByValue的实例作为参数传递给sort()方法:

Collections.sort(list, new CompareByValue());

答案 1 :(得分:0)

仅从上面的代码,它看起来很好。你确定上面代码中的例外吗? 如果您只将Stock对象放入任何已排序的集合中,您将看到此类异常并需要实现Comparable接口。

但是对于只是通过自定义Comparator的情况,您不需要使Stock成为Comparable。就像你给匿名的Comparator实现一样。

将比较器设置为像TreeSet这样的已排序集合,然后将stock对象添加到sorted集合中,它应该可以在不实现Comparable接口的情况下工作。

答案 2 :(得分:0)

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));
                } 
}