如何创建未指定对象集合的 EnumSet
How to create an EnumSet of a collection of unspecified objects
给定数据:
我收到了一个合集:
Collection<?> collection
此集合可能包含任何内容。它可以是“正常的”classes,也可以是枚举值。
此时在我的代码中已知 class。我得到:
Class<?> clazz
保证是集合中包含的 class 个对象。没有class-混合。
目标:
如果 collection
中对象的 clazz
是任何类型的枚举,我希望创建包含的对象的 EnumSet
。出于我的目的,我可以只使用给定的集合 运行 。然而,枚举集效率更高,AFAIK。
我的收获:
- 确定我是否正在处理 class 的
Enum
类型,方法是:
if (Enum.class.isAssignableFrom(clazz)) {
//noinspection unchecked
Class<? extends Enum<?>> enumClass = ((Class<? extends Enum<?>>) clazz);
System.out.println("enumClass: " + enumClass.getSimpleName()); // prints the correct class!
// what now? :-(
}
我在纠结什么:
除此之外,感觉就像我已经尝试过各种将东西扔在墙上的方法,看看有什么能粘住。在尝试创建通用 EnumSet
时,我什至从未达到 IDE 让我编译的地步。
已找到答案
根据下面@JayC667 的回答(非常感谢您的努力),我为自己的目的提取了以下答案:
if (Enum.class.isAssignableFrom(clazz)) {
EnumSet<?> enumSet = collection.isEmpty() ? EnumSet.noneOf(((Class<? extends Enum>) clazz)) : EnumSet.copyOf((Collection<Enum>) collection);
}
我不确定这是否回答了您的问题...
中心部分是 EnumSet.copyOf((Collection<TestEnum1>) collection)
。
代码在测试中工作正常,但我不确定你打算用它做什么,所以...祝你好运 ;-)
package Whosebug;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
public class EnumSetMess {
public enum TestEnum1 {
A, B, C;
}
public enum TestEnum2 {
A, B, C;
}
public static void main(final String[] args) {
{
final ArrayList<TestEnum1> list = new ArrayList<>();
list.add(TestEnum1.A);
list.add(TestEnum1.B);
list.add(TestEnum1.C);
final Set<?> res = x(list, TestEnum1.class);
System.out.println("Set: " + res.getClass().getSimpleName());
for (final Object r : res) {
System.out.println("\t" + r);
}
}
{
final ArrayList<TestEnum2> list = new ArrayList<>();
list.add(TestEnum2.A);
list.add(TestEnum2.B);
list.add(TestEnum2.C);
final Set<?> res = x(list, TestEnum2.class);
System.out.println("Set: " + res.getClass().getSimpleName());
for (final Object r : res) {
System.out.println("\t" + r);
}
}
{
final ArrayList<String> list = new ArrayList<>();
list.add("sA");
list.add("sB");
list.add("sC");
final Set<?> res = x(list, String.class);
System.out.println("Set: " + res.getClass().getSimpleName());
for (final Object r : res) {
System.out.println("\t" + r);
}
}
}
static Set<?> x(final Collection<?> collection, final Class<?> clazz) {
if (Enum.class.isAssignableFrom(clazz)) {
//noinspection unchecked
// final Class<? extends Enum<?>> enumClass = ((Class<? extends Enum<?>>) clazz); // actually we dont need this line
//System.out.println("enumClass: " + enumClass.getSimpleName()); // prints the correct class! // actually we dont need this line
// what now? :-(
// final EnumSet<?> ret = EnumSet.copyOf((Collection<TestEnum1>) collection); // you COULD write this line here thanx to type erasure.
final EnumSet<?> ret = EnumSet.copyOf((Collection<? extends Enum>) collection); // tho this looks cleaner
return ret;
}
return new HashSet<>(collection);
}
}
输出为
enumClass: TestEnum1
Set: RegularEnumSet
A
B
C
enumClass: TestEnum2
Set: RegularEnumSet
A
B
C
Set: HashSet
sC
sA
sB
给定数据:
我收到了一个合集:
Collection<?> collection
此集合可能包含任何内容。它可以是“正常的”classes,也可以是枚举值。
此时在我的代码中已知 class。我得到:
Class<?> clazz
保证是集合中包含的 class 个对象。没有class-混合。
目标:
如果 collection
中对象的 clazz
是任何类型的枚举,我希望创建包含的对象的 EnumSet
。出于我的目的,我可以只使用给定的集合 运行 。然而,枚举集效率更高,AFAIK。
我的收获:
- 确定我是否正在处理 class 的
Enum
类型,方法是:
if (Enum.class.isAssignableFrom(clazz)) {
//noinspection unchecked
Class<? extends Enum<?>> enumClass = ((Class<? extends Enum<?>>) clazz);
System.out.println("enumClass: " + enumClass.getSimpleName()); // prints the correct class!
// what now? :-(
}
我在纠结什么:
除此之外,感觉就像我已经尝试过各种将东西扔在墙上的方法,看看有什么能粘住。在尝试创建通用 EnumSet
时,我什至从未达到 IDE 让我编译的地步。
已找到答案
根据下面@JayC667 的回答(非常感谢您的努力),我为自己的目的提取了以下答案:
if (Enum.class.isAssignableFrom(clazz)) {
EnumSet<?> enumSet = collection.isEmpty() ? EnumSet.noneOf(((Class<? extends Enum>) clazz)) : EnumSet.copyOf((Collection<Enum>) collection);
}
我不确定这是否回答了您的问题...
中心部分是 EnumSet.copyOf((Collection<TestEnum1>) collection)
。
代码在测试中工作正常,但我不确定你打算用它做什么,所以...祝你好运 ;-)
package Whosebug;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.Set;
public class EnumSetMess {
public enum TestEnum1 {
A, B, C;
}
public enum TestEnum2 {
A, B, C;
}
public static void main(final String[] args) {
{
final ArrayList<TestEnum1> list = new ArrayList<>();
list.add(TestEnum1.A);
list.add(TestEnum1.B);
list.add(TestEnum1.C);
final Set<?> res = x(list, TestEnum1.class);
System.out.println("Set: " + res.getClass().getSimpleName());
for (final Object r : res) {
System.out.println("\t" + r);
}
}
{
final ArrayList<TestEnum2> list = new ArrayList<>();
list.add(TestEnum2.A);
list.add(TestEnum2.B);
list.add(TestEnum2.C);
final Set<?> res = x(list, TestEnum2.class);
System.out.println("Set: " + res.getClass().getSimpleName());
for (final Object r : res) {
System.out.println("\t" + r);
}
}
{
final ArrayList<String> list = new ArrayList<>();
list.add("sA");
list.add("sB");
list.add("sC");
final Set<?> res = x(list, String.class);
System.out.println("Set: " + res.getClass().getSimpleName());
for (final Object r : res) {
System.out.println("\t" + r);
}
}
}
static Set<?> x(final Collection<?> collection, final Class<?> clazz) {
if (Enum.class.isAssignableFrom(clazz)) {
//noinspection unchecked
// final Class<? extends Enum<?>> enumClass = ((Class<? extends Enum<?>>) clazz); // actually we dont need this line
//System.out.println("enumClass: " + enumClass.getSimpleName()); // prints the correct class! // actually we dont need this line
// what now? :-(
// final EnumSet<?> ret = EnumSet.copyOf((Collection<TestEnum1>) collection); // you COULD write this line here thanx to type erasure.
final EnumSet<?> ret = EnumSet.copyOf((Collection<? extends Enum>) collection); // tho this looks cleaner
return ret;
}
return new HashSet<>(collection);
}
}
输出为
enumClass: TestEnum1
Set: RegularEnumSet
A
B
C
enumClass: TestEnum2
Set: RegularEnumSet
A
B
C
Set: HashSet
sC
sA
sB