以下java代码使用TreeSet
来收集从类MyClass
派生的对象,该对象未实现Comparable
接口,也没有compareTo()
方法来执行对象之间的比较。通过不提供该比较方法,我们期望在添加第二对象期间引发异常,而不是只有一个对象的比较不明确的第一对象。
JDK:1.7
问题:
为什么在{strong>第一次添加compareTo()
时会触发tree.add(m1)
?
代码:
package javaapplication1;
import java.util.*;
class MyClass
{
int _x;
MyClass(int x)
{
_x = x;
}
}
public class JavaApplication1
{
public static void main(String[] args)
{
MyClass m1 = new MyClass(5);
MyClass m2 = new MyClass(3);
TreeSet tree = new TreeSet();
tree.add(m1);
tree.add(m2);
}
}
答案 0 :(得分:2)
这是来自TreeMap
的{{1}}方法的实际代码。由于put
不是ClassCastException
,您将尝试add
key
第一次。请注意,Comparable
在内部使用TreeSet
,您在TreeMap
中添加的任何内容都是TreeSet
(key
未使用)。
value
答案 1 :(得分:1)
TreeSet
在TreeMap
之上实施。因此TreeSet.add()
调用TreeMap.put(Object, Object)
方法。请参阅以下内容:
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) {
compare(key, key); //this is the culprit
root = new Entry<>(key, value, null);
size = 1;
modCount++;
return null;
}
……………
……………
……………
}
现在,root
为null
,因此流量会进入if (t == null) {
,因此会调用compare(key, key)
。
final int compare(Object k1, Object k2) {
return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}
在compare
方法内部,它是类型转换k1, k2
Comparable
,而您的类未实现Comparable
因此例外:
Exception in thread "main" java.lang.ClassCastException:
。
此代码符合JDK 1.7。