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

Groovy中实现枚举元素正确相减的声明类型及原理问题

正确的使用方式

你可以选择以下三种方案实现枚举值的正常相减:

  1. 直接用def声明变量,让Groovy自动推断类型
  2. 显式声明变量类型为List<MyEnum>
  3. 如果一定要用Collection类型,手动把数组转换为标准集合即可:
Collection<MyEnum> a = MyEnum.values().toList()
println (a - MyEnum.values()) // 输出结果: []

背后的原理

  • 枚举类的values()方法返回的是原生对象数组,类型为MyEnum[],本身不属于标准集合类。
  • 用def或者List<MyEnum>接收数组时,Groovy会自动把原生数组转换为java.util.ArrayList实例。此时执行-运算符(对应Groovy的集合minus方法),Groovy会自动把右侧的数组也转为列表,按元素相等性移除所有重合项,最终得到空集合。
  • 直接用Collection<MyEnum>接收数组时,Groovy不会做完整的集合转换,只会用java.util.Arrays.asList()给数组套一层只读的内部ArrayList适配器。针对这个适配器执行-操作时,Groovy不会把右侧的数组转为列表,而是尝试把整个数组作为单个元素从集合中移除,你的集合里只有枚举实例,没有数组类型的元素,所以所有元素都被保留,输出[ONE, TWO]。

内容的提问来源于stack exchange,提问作者Michal_Szulc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:21:02