2

这是我的代码:

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对象,我确定没有指定 aComparator用于排序。这段代码如何无异常运行?它打印出来了1

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

编辑:我正在使用 Java 6

4

3 回答 3

6

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

由于 中的错误java.util.TreeMap以前可以将无效的 null 元素和未实现的元素插入Comparable 到空TreeMaps 和TreeSets中。只能将单个无效元素插入到空TreeMap的 s 或TreeSets 中;额外的元素会导致预期的NullPointerExceptionor ClassCastException。对集合的大多数其他操作也会失败。从 JDK 7 开始,将无效的 null 元素或未实现的元素 Comparable插入空TreeMapTreeSet抛出 NullPointerException.

TreeSet以 aTreeMap作为其底层数据结构来实现。)

于 2014-03-05T16:37:42.843 回答
2

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

ClassCastException - 如果指定的对象不能与当前在此集合中的元素进行比较

编辑

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

于 2014-03-05T16:34:00.767 回答
0

很不错的把戏。您没有收到异常,因为您没有添加多个对象,因为只有这样您才需要比较最终会引发异常的对象。

于 2014-03-05T16:40:16.460 回答