EnumSet.copyOf 空集合抛出 IllegalArgumentException 异常

5

我有以下代码,会因为参数异常而失败:

public EnumSet<test> getData(){  // Line 1
   return EnumSet.copyOf(get(test))) // Line 2
}



private Collection<Test> get(Test[] test){  //Line 1
 test= test==null ? new Test[0] : test;     // line 2
 return Array.asList(test) //Line 3
}

如果test为null,则get函数的第2行会创建一个空的Test数组,并且EnumSet.copyOf(get(test))会抛出IllegalArgumentException异常。
我不明白为什么会抛出这个异常?

4
Javadoc中写道:指定的集合必须至少包含一个元素(以确定新枚举集的元素类型)。 - JB Nizet
2
请参阅文档:https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html#copyOf(java.util.Collection) - gudok
参见:https://stackoverflow.com/questions/32722808/java-enumset-copyof-is-there-a-room-for-improvement/55925249#55925249 - Thomas Bitonti
1个回答

7
一个 EnumSet 使用一些反射来识别其元素的类型。(该集合使用 enum 值的 "ordinal" 来跟踪每个元素是否包含在内。)
当你使用 copyOf(Collection) 创建一个 EnumSet 时,它会检查集合是否为 EnumSet。如果是,它将使用与源集相同的类型。否则,它会尝试在源集合中的第一个元素上调用 getClass()。如果集合为空,则没有第一个元素,也没有任何内容可以查询其类。因此,在这种情况下会失败(“如果 c 不是 EnumSet 实例并且不包含任何元素,则抛出 IllegalArgumentException”)。
要创建一个空的 EnumSet,您需要自己确定类,并使用 noneOf()
Collection<Test> tests = get(test);
return tests.isEmpty() ? EnumSet.noneOf(Test.class) : EnumSet.copyOf(tests);

1
省略将数组转换为“Collection”后再创建“EnumSet”的步骤,即只需使用“EnumSet<Test> result = EnumSet.noneOf(Test.class); if(test!=null) Collections.addAll(result, test); return result;” - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接