You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:25:58