Java:首先添加调用时触发的TreeSet compareTo方法

时间:2013-11-20 09:17:35

标签: java exception comparison treeset

以下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);
     }
}

2 个答案:

答案 0 :(得分:2)

这是来自TreeMap的{​​{1}}方法的实际代码。由于put不是ClassCastException,您将尝试add key 第一次。请注意,Comparable在内部使用TreeSet,您在TreeMap中添加的任何内容都是TreeSetkey未使用)。

value

答案 1 :(得分:1)

TreeSetTreeMap之上实施。因此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;
        }
    ……………
    ……………
    ……………
}

现在,rootnull,因此流量会进入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。