当我尝试使用自定义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?关于如何修复此代码的任何想法都会受到赞赏!
答案 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)