我发现编写适用于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
?
答案 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
。