2013-10-31 28 views
8

我正在做一个java项目,我得到了这个问题,不知道如何解决它。MyClass不能转换为java.lang.Comparable:java.lang.ClassCastException

在我的项目中的类(简体):

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

    } 

}

当我尝试运行该程序,它会给出错误:

Exception in thread "main" java.lang.ClassCastException: Stock cannot be cast to java.lang.Comparable

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

+1

你如何运行程序,特别是在你对列表进行排序的地方? –

回答

12

这是因为Stock未执行Comparable。无论是实现它:

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

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

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

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

但是对于只通过自定义比较器的情况,您不需要使库存成为可比较的。就像你给匿名比较器实现一样。

将您的比较器设置为像TreeSet一样的排序集合,然后将库存对象添加到排序后的集合中,它应该工作而不需要实现Comparable接口。

+0

我很抱歉大家。刚发现txt文件中有一个输入错误,使得创建一个空对象并将其添加到ArrayList中。请尽快删除此问题。 – user2234225

相关问题