我有一个类EnumSet<E extends Enum<E>>
,它有一个方法public void include(E e)
,它接受枚举常量并将其放入一个列表中,代表一组给定的枚举。
现在我想通过反射从xml文件加载EnumSet,这样我就可以迭代ove rall枚举常量并将它们包含在加载的集合中。
Object[] enum_const = Class.forName(cur.getAttributeValue("type")).getEnumConstants();
field.set(obj, Class.forName(cur.getAttributeValue("type")).newInstance());
for (Object o : enum_const) {
if (o.toString().equalsIgnoreCase(cur.getText())) {
((EnumSet<?>) field.get(obj)).include((E) o);
// Include each matching EnumConstant..
}
}
无法进行最后一次演员,因为在该上下文中无法访问E.有没有人有这个问题的解决方案?
答案 0 :(得分:0)
您可以使用通用辅助方法:
@SuppressWarnings("unchecked")
static <E extends Enum<E>> void uncheckedInclude(EnumSet<?> enumSet, Object element) {
EnumSet<E> enumSetWithNarrowedType = (EnumSet<E>) enumSet;
E elementWithNarrowedType = (E) element;
enumSetWithNarrowedType.include(elementWithNarrowedType);
}
...
if (o.toString().equalsIgnoreCase(cur.getText())) {
uncheckedInclude((EnumSet<?>) field.get(obj), o);
}
请注意,此处有两个未经检查的强制转换,一个用于集合,另一个用于元素。从EnumSet<?>
到EnumSet<E>
的强制转换是必要的,因为通用通配符无法表达递归E extends EnumSet<E>
边界。
显然@SuppressWarnings("unchecked")
承诺这些类型是正确的,因为即使是JVM也不能快速失败以进行错误的未经检查的强制转换 - 确保文档记录良好并确保帮助方法不是正确的。被虐待。