我没有用jdk7作者: 黄连兵 时间: 2012-6-15 17:10
Exception in thread "main" java.lang.ClassCastException: com.practise.Student1 cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1188)
at java.util.TreeMap.put(TreeMap.java:531)
at java.util.TreeSet.add(TreeSet.java:255)
at com.practise.TreeSetDemo2.main(TreeSetDemo2.java:24)
请查看源代码:
程序执行的顺序好像是这样的:13. ts.add(new Student("张三",30));
运行到此处,add()方法会调用put()方法:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
put()方法是这样的:
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
compare(key, key); // type (and possibly null) check
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
此处的compare()又调用的是compareTo():
final int compare(Object k1, Object k2) {
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}作者: 庄星睿 时间: 2012-6-15 17:37
黄连兵 发表于 2012-6-15 17:10
Exception in thread "main" java.lang.ClassCastException: com.practise.Student1 cannot be cast to jav ...
庄星睿 发表于 2012-6-15 17:37
我大概理解了,我也找了源码文件,只在TreeSet.java文件里找到了
public boolean add(E e) {
ret ...
异常都提示了:
at java.util.TreeMap.compareTreeMap.java:1188)(
at java.util.TreeMap.put(TreeMap.java:531)
去java安装目录的src.zip里可以找得到。
至于为什么null也要比较,我觉得是不是因为map里是允许存入null键和null值的关系呢?这个纯属个人理解有待继续研究。