Java:可以将1个非Comparable对象添加到TreeSet中吗?

时间:2014-03-05 16:28:55

标签: java set ocpjp

这是我的代码:

public static void main(String[] args){
    TreeSet<Dog> d = new TreeSet<Dog>();
    d.add(new Dog());
    System.out.println(d.size());
}

class Dog{
}

如您所见,Dog类不是Comparable对象,我确定没有指定用于排序的Comparator。这段代码如何在没有异常的情况下运行?它打印出1

我尝试向TreeSet添加另一个Dog,并按预期抛出ClassCastException

编辑:我正在使用Java 6

3 个答案:

答案 0 :(得分:5)

Java 7中添加了一项更改以解决此问题。这是一个错误。

  

由于java.util.TreeMap中的错误,以前可能会出错   插入无效的null元素和未实现Comparable的元素   进入空TreeMapTreeSet s 。只有一个无效元素可以   被插入空TreeMapTreeSet s;其他元素   会导致预期的NullPointerExceptionClassCastException。   收集时的大多数其他操作也会失败。从JDK开始   7,插入无效的null元素或未实现的元素   ComparableTreeMapTreeSet投掷a   NullPointerException

TreeSet是以TreeMap为基础数据结构实现的。)

答案 1 :(得分:2)

根据javadoc的预期行为,只有当新元素无法与集合中的当前元素进行比较时,它才会抛出ClassCastException:

  

ClassCastException - 如果指定的对象无法与此set

中当前的元素进行比较

修改

但是,这对JSE6有效,显然JSE7中TreeSet的javadoc已经过时,因为@SotiriosDelimanolis指出,这个问题已经解决了JSE7。

答案 2 :(得分:0)

非常好的技巧。你没有得到异常,因为你没有添加多个对象,因为只有那时你需要比较最终会抛出异常的对象。