【问题标题】:Java: Possible to add 1 non-Comparable object to a TreeSet?Java:可以向 TreeSet 添加 1 个不可比较的对象吗?
【发布时间】:2014-03-05 16:28:54
【问题描述】:

这是我的代码:

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 用于排序。这个sn-p的代码是如何无异常运行的呢?它打印出1。

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

编辑:我正在使用 Java 6

【问题讨论】:

  • 我在 Java 7 中确实得到了 ClassCastException。添加的第一个元素应该与它自身进行比较。我相信这个改变是为了抓住那个极端情况。
  • 哦,我忘了说我正在使用 Java 6。
  • 再添加一个元素,你会得到你想要的:)
  • @Mak 是的,我知道哈哈。只是我希望它在我第一次添加一个不可比较的对象时抛出异常:P
  • @MiguelPortugal :) Java 人员正在努力解决这些问题,正如您现在看到的那样,它在 Java 7 中已修复,但您确实得到了异常。

标签: java set ocpjp


【解决方案1】:

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

由于java.util.TreeMap 中的错误,以前可以 插入无效的 null 元素和未实现 Comparable 的元素 进入空的TreeMaps 和TreeSets。只有一个无效元素可以 插入空的TreeMaps 或TreeSets;附加元素 会导致预期的NullPointerException 或ClassCastException。 对集合的大多数其他操作也会失败。从 JDK 开始 7、插入无效的空元素或未实现的元素 Comparable 变成一个空的 TreeMap 或 TreeSet 抛出一个 NullPointerException.

(TreeSet 以TreeMap 作为其底层数据结构实现。)

【讨论】:

  • hmmm,有趣,看起来他们没有更新 TreeSet 的 javadoc。
  • @CamiloBermúdez 我正在尝试解释您在回答中引用的 javadoc 以使其适应更改,但这听起来不太好。他们也应该更新了。该实现只是将第一个元素与自身进行比较。
  • 我在 JDK 7 源代码中也看到了这一点。现在有一个转换为 Comparable 的特殊情况类,即使没有可比较的对象也会强制异常。
【解决方案2】:

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

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

编辑

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

【讨论】:

    【解决方案3】:

    非常好的技巧。您没有收到异常,因为您没有添加多个对象,因为只有这样您才需要比较最终会引发异常的对象。

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 2020-06-06
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2015-08-13
      • 1970-01-01
      相关资源
      最近更新 更多