我有这个方法:
private SortedMap<String, SpaceObjectImpl> catalog = new TreeMap<String, SpaceObjectImpl>();
public Collection<SpaceObject> getSpaceObjects(){
SortedSet<SpaceObject> temp = new TreeSet<SpaceObject>(catalog.values());
return temp;
}
而compareTo在这里定义:
public int compareTo(SpaceObjectImpl s){
....
}
class SpaceObjectImpl implements SpaceObject
当我运行程序时,会抛出ClassCastException
。知道为什么吗?
错误:
SpaceObjectImpl cannot be cast to java.lang.Comparable(in TreeMap)
答案 0 :(得分:1)
SpaceObjectImpl
必须实施Comparable<SpaceObjectImpl>
。
答案 1 :(得分:0)
compareTo方法在Comparable中定义,您的自定义类应该覆盖它以在TreeMap中使用它。请在自定义类中实现类似的接口
答案 2 :(得分:0)
您已经编写了自己的compareTo()
方法。你需要编写自己的compareTo()
但是,这需要被覆盖,即你的班级应该实现Comparable
实现此接口的对象的列表(和数组)可以由Collections.sort(和Arrays.sort)自动排序。
答案 3 :(得分:0)
所有已排序的数据结构/集合,排序都是根据compareTo方法完成的。在您的情况下,对象是用户定义的,因此默认情况下该类中没有compareTo方法。你必须实现
Comparable
并根据您的排序标准逻辑覆盖它的compareTo方法。
可以在http://www.mkyong.com/java/java-object-sorting-example-comparable-and-comparator/
找到更多信息希望这会有所帮助。
答案 4 :(得分:-1)
您的SpaceObjectImpl
必须实施Comparable
界面。
以下是an example by mkyong说明了这一概念:
public class Fruit implements Comparable<Fruit>{
private String fruitName;
private String fruitDesc;
private int quantity;
public Fruit(String fruitName, String fruitDesc, int quantity) {
super();
this.fruitName = fruitName;
this.fruitDesc = fruitDesc;
this.quantity = quantity;
}
public String getFruitName() {
return fruitName;
}
public void setFruitName(String fruitName) {
this.fruitName = fruitName;
}
public String getFruitDesc() {
return fruitDesc;
}
public void setFruitDesc(String fruitDesc) {
this.fruitDesc = fruitDesc;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int compareTo(Fruit compareFruit) {
int compareQuantity = ((Fruit) compareFruit).getQuantity();
//ascending order
return this.quantity - compareQuantity;
//descending order
//return compareQuantity - this.quantity;
}
}
此处,Fruit
类已实施Comparable
接口,类型为Fruit
,并且还有overriden
compareTo
方法。