在java中转换为泛型参数

时间:2014-12-05 15:11:33

标签: java generics casting enums

我有一个类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.有没有人有这个问题的解决方案?

1 个答案:

答案 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也不能快速失败以进行错误的未经检查的强制转换 - 确保文档记录良好并确保帮助方法不是正确的。被虐待。