采用Enum参数的静态方法

时间:2014-11-28 15:31:28

标签: java enums

我发现编写适用于Enums的静态方法非常困难。这是一个非常人为的例子,但假设您想编写一个采用Enum常量并返回下一个声明的方法的方法。我发现(大约一个小时后)你可以按照以下方式做到。它有效,并且不会生成任何编译器警告。

static <E extends Enum<E>> E getNextDeclared(E e) {
    int ordinal = e.ordinal();
    for (Object object : EnumSet.allOf(e.getClass())) {
        if (e.getClass().cast(object).ordinal() == ordinal + 1) {
            return e.getDeclaringClass().cast(object);
        }
    }
    throw new IllegalArgumentException();
}

我错过了什么吗?没有演员阵容你能做到吗?有没有办法在不产生大量警告的情况下简化此操作?还有什么适当的类来代替Object

1 个答案:

答案 0 :(得分:1)

像这样:

static <E extends Enum<E>> E getNextDeclared(E e) {
    int ordinal = e.ordinal();
    for (E object : EnumSet.allOf(e.getDeclaringClass())) {
        if (object.ordinal() == ordinal + 1) {
            return object;
        }
    }
    throw new IllegalArgumentException();
}

或者,路易斯·沃瑟曼建议:

static <E extends Enum<E>> E getNextDeclared(E e) {
    return e.getDeclaringClass().getEnumConstants()[e.ordinal() + 1];
}

(如果过高则会引发ArrayIndexOutOfBoundsException而不是IllegalArgumentException