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; } }
然后我尝试排序Stock的ArrayList
,所以我创建了另一个名为CompareByValue
类
public class CompareByValue implements Comparator { @Override public int compare(Stock stock1, Stock stock2) { return (stock1.getInventoryValue() - stock2.getInventoryValue()); }
}
当我尝试运行该程序时,它会给出错误:
线程“main”中的exceptionjava.lang.ClassCastException:Stock无法强制转换为java.lang.Comparable
谁知道什么是错的?
这是因为Stock
没有实现Comparable
。 实现它:
public class Stock implements Comparable { public int compareTo(Stock o) { // ... } }
…或者将CompareByValue
的实例作为参数传递给sort()
方法:
Collections.sort(list, new CompareByValue());
只有从上面的代码,它看起来很好。 你确定上面代码的例外吗? 如果您只是将Stock对象放入任何已排序的集合中,您将看到此类exception并需要实现Comparable接口。
但是对于只通过自定义Comparator的情况,您不需要使Stock成为Comparable。 就像你给匿名的Comparator实现一样。
将比较器设置为像TreeSet这样的已排序集合,然后将stock对象添加到sorted集合中,它应该可以在不实现Comparable接口的情况下工作。
- 将SuperClass的对象转换为子类
- 从调用返回另一个代理的Java.lang.reflect.Proxy在赋值时导致ClassCastException
- 引起:java.lang.ClassCastException:java.sql.Timestamp无法强制转换为java.sql.Date
- Java:未选中从X转换为Y /如何实现castOrNull
- 将HashMap值添加到TreeSet时出错
- ClassCastException在Hibernate / Spring 4升级后,无法将Proxy36强制转换为SessionImplementor
- 在进行通用转换时,在generics方法中捕获ClassCastException
- 如何构建同一个加载不同类加载器的两个实例?
- 这有什么不对? 我得到一个java.lang.ClassCastException错误,但我看不出我出错的地方