[英]Casting to generic parameter in java
我有一个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。 有人对此问题有解决方案吗?
您可以使用通用的辅助方法:
@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对于错误的未经检查的强制转换也无法快速失败-确保记录正确,并确保不滥用helper方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.