Groovy中实现枚举元素正确相减的声明类型及原理问题
正确的使用方式
你可以选择以下三种方案实现枚举值的正常相减:
- 直接用
def声明变量,让Groovy自动推断类型 - 显式声明变量类型为
List<MyEnum> - 如果一定要用
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
相关产品推荐
相关产品推荐

