实例化泛型类型的EnumSet

5

我有两个实现共同接口的枚举类型。我尝试声明这个接口,以使只有枚举类型才能实现它。

interface CommonEnumInterface<E extends Enum<?>> {

    /** It doesn't matter what this does. */
    E commonInterfaceMethod();

}

enum Enum1 implements CommonEnumInterface<Enum1> {
    FOO,
    BAR,
    BAZ;

    @Override
    public Enum1 commonInterfaceMethod() {
        return null;
    }
}

enum Enum2 implements CommonEnumInterface<Enum2> {
    BLAH,
    YADDA,
    RHUBARB;

    @Override
    public Enum2 commonInterfaceMethod() {
        return Enum2.BLAH;
    }
}

现在我想声明一个泛型类型参数,它应该扩展 CommonEnumInterface,这应该意味着泛型类型也是一个枚举类型:

class CreatingGenericEnumSet<E extends Enum<E> & CommonEnumInterface<E>> {

    CreatingGenericEnumSet() {

        // Is it possible to instantiate an EnumSet of a generic type?
        EnumSet<E> enumSet = EnumSet.noneOf(E.class); // Illegal class literal

        // According to a comment by @tackline, this is illegal, too.
        Collection<E> hackyVariable = Collections.emptyList();
        EnumSet<E> jankyWay = EnumSet.copyOf(hackyVariable);

    }
}

我的问题在上面的评论中。有没有一种方式,最好是一行代码,来声明一个泛型类型的EnumSet?

这是声明接口和类型参数的正确方式吗?


1
注意EnumSet.copyOf(Collection)的API文档中指出:如果c不是EnumSet实例并且不包含任何元素,则会抛出IllegalArgumentException异常。这个API有点恶心。 - Tom Hawtin - tackline
谢谢,@Tom。我已经编辑了我的问题。 - Michael Scheper
1个回答

6
class CreatingGenericEnumSet<E extends Enum<E> & CommonEnumInterface<E>> {

    CreatingGenericEnumSet(Class<E> enumClass) {

        EnumSet<E> enumSet = EnumSet.<E>noneOf(enumClass);


    }
}

类似的问题可以在这里找到 这里


这个有效。谢谢。不幸的是,这里链接到的答案中提到的“技巧”并不起作用。http://stackoverflow.com/a/623691/1450294 也许你的方法是唯一的方法。 - Michael Scheper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接