每种枚举有一个ordinal
,所以它是有效的,以获得“下一个”值的所有枚举 - 不只是那些你正在试图用一个基类。这意味着你可以写出下面的辅助方法:
public static <T extends Enum<T>> T getNext(T current) {
Class<T> enumType = current.getDeclaringClass();
T[] enumConstants = enumType.getEnumConstants(); // Similar to e.g. Day.values()
int currentOrdinal = current.ordinal();
int nextOrdinal = currentOrdinal + 1;
if (nextOrdinal == enumConstants.length) { // Handle wrapping around to the beginning of the enum values
nextOrdinal = 0;
}
return enumConstants[nextOrdinal];
}
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}
public static void main(String... args) {
System.out.println(getNext(Day.MONDAY)); // TUESDAY
System.out.println(getNext(Day.SUNDAY)); // MONDAY
System.out.println(getNext(Month.JANUARY)); // FEBRUARY
System.out.println(getNext(Month.DECEMBER)); // JANUARY
}
如果你真的想不能够对所有枚举(也许它不会使未严格有序枚举意义上)做到这一点,那么你可以申请一个标记接口,就像这样:
public interface Ordered {}
public enum Day implements Ordered {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static <T extends Enum<T> & Ordered> T getNext(T current) {
...
}
你可以找到关于使用枚举here反思工作的一些细节。
只需制作一个“HasNext”界面或其他东西,不是吗? –