尝试在没有比较器的情况下添加树集时,StringBuffer 不给出 ClassCastException

StringBuffer not giving ClassCastException when trying to add in a treeset without Comparator

我在尝试 运行 以下代码时期待 ClassCastException:

 //  TreeSet<StringBuffer> t = new TreeSet<StringBuffer>((a, b) -> - 
  // a.toString().compareTo(b.toString()));
     TreeSet<StringBuffer> t = new TreeSet<StringBuffer>();
        Function<String, StringBuffer> f = s -> new StringBuffer(s);
        t.add(f.apply("A"));
        t.add(f.apply("M"));
        t.add(f.apply("B"));
        t.add(f.apply("Z"));
        t.add(f.apply("G"));
        System.out.println(t);

我已经评论了比较器代码,并尝试在没有比较器的情况下使用。但我仍然得到正确的输出。这怎么可能,因为 StringBuffer 没有实现 Comparable 接口。我现在用的是Java11,后面的版本有没有和这个相关的改动。

您正在比较器中将 StringBuffer 转换为 String,并且 String class implements Comparable interface, And also as a note since from jdk-11 StringBuffer and StringBuilder 还实现了 Comparable

(a, b) -> -a.toString().compareTo(b.toString())

但是如果你的版本低于jdk-11你会得到编译时错误

The method compareTo(StringBuffer) is undefined for the type StringBuffer

这是可能的,因为 StringBuffer does 实现了 Comparable 接口。

API 注意: StringBuffer 实现 Comparable 但不覆盖 equals。因此,StringBuffer 的自然顺序与 equals 不一致。如果将 StringBuffer 对象用作 SortedMap 中的键或 SortedSet 中的元素,则应小心。有关更多信息,请参见 Comparable、SortedMap 或 SortedSet。 自从: 1.0 也可以看看: StringBuilder、字符串、序列化形式 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/StringBuffer.html#:~:text=StringBuffer%20implements%20Comparable%20but%20does,or%20elements%20in%20a%20SortedSet%20.