使用自定义类作为键时,使用Java的TreeMap进行ClassCastException

时间:2013-06-13 15:38:52

标签: java casting classcastexception treemap

当我尝试使用自定义ClassCastException类作为关键字来映射时,以下代码会引发Dog

import java.util.TreeMap;

public class testMain {
        public static void main(String[] args) {

            TreeMap<Dog, String> m = new TreeMap<Dog, String>();
            m.put(new Dog("Fido"), "woof");

            // this line produces a ClassCastException
            String sound = m.get(new Dog("Fido"));

            System.out.println(sound);
    }
}

狗类很简单:

public class Dog {

    String name;

    public Dog(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

我不明白为什么TreeMap会首先投放Dog类。 为什么在使用自定义类作为键时会出现ClassCastException?关于如何修复此代码的任何想法都会受到赞赏!

3 个答案:

答案 0 :(得分:3)

TreeMap根据键的顺序对插入时间中的元素进行排序。因此,用作密钥的对象必须实现Comparable接口。

请参阅我对您的Dog课程所做的修改。它现在有效:

public static class Dog implements Comparable<Dog> {

    String name;

    public Dog(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public int compareTo(Dog obj) {
        return name.compareTo(obj.name);
    }
}

编辑:ClassCastException异常的原因:

如果您在Comparable<? super K> k = (Comparable<? super K>) key;的{​​{1}}方法的代码中看到行get,您会看到它正在尝试将您的密钥转换为TreeMap对象。您的对象不是Comparable的实例。

Comparable

答案 1 :(得分:1)

如果你想在不使用比较器的TreeMap中将它用作键,那么Dog必须实现Comparable

答案 2 :(得分:0)

您必须让Dog类实现Comparable接口。

class Dog implements Comparable<Dog>

来自doc:

  

地图根据其键的natural ordering进行分类