JDK21+Eclipse环境下未抛出ClassCastException问题求助
为什么TreeSet在JDK21中未抛出ClassCastException?
在Eclipse环境使用JDK21时,测试TreeSet<StringBuffer>预期会抛出ClassCastException,但实际元素被正常排序输出,未出现异常。
测试代码
TreeSet<StringBuffer> StringBuffer_ts=new TreeSet<>(); StringBuffer_ts.add(new StringBuffer("Ting")); StringBuffer_ts.add(new StringBuffer("Dong")); System.out.println(StringBuffer_ts);
实际输出
[Dong, Ting]
预期结果
抛出ClassCastException
原因解释
核心是JDK版本迭代带来的类实现变更:
- 在JDK 11之前,
StringBuffer的父类AbstractStringBuilder并未实现Comparable接口,因此StringBuffer不具备自然排序能力。使用无参构造的TreeSet(依赖自然排序)时,会在元素比较环节抛出ClassCastException——因为无法将StringBuffer转换为Comparable类型完成排序。 - 从JDK 11开始,
AbstractStringBuilder新增实现了Comparable<AbstractStringBuilder>接口,StringBuffer作为其子类自动继承了该比较能力。在JDK21中,TreeSet可以通过StringBuffer继承的compareTo方法按字符串内容的字典序完成自然排序,因此不会抛出异常,而是正常输出排序后的结果。
内容的提问来源于stack exchange,提问作者soundarya damotharan
相关产品推荐
相关产品推荐

