繁体   English   中英

在Java中转换为通用参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM