Java - 类似的强制转换异常

时间:2012-12-18 10:29:21

标签: java classcastexception comparable

我有这个方法:

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)

5 个答案:

答案 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方法。