Ответ на этот вопрос может зависеть от того, что ожидается от «кастинга»:
Кастинг по порядковому положению
В представленном примере нет никакого сходства между наборами значений в двух перечислениях, поэтому я предполагаю, что намерение состояло в том, чтобы перевести по порядковому положению, что Enum1.ONE
=> Enum2.FOUR
, Enum1.TWO
=> Enum2.FIVE
и Enum1.THREE
=> Enum2.SIX
. Это можно сделать следующим образом:
Enum2 en2 = Enum2.values()[Enum1.ONE.ordinal()];
Следующий естественный вопрос - как это можно расширить на универсальную функцию, которая будет делать то же самое для любых двух типов enum
. Не для слабонервных, но следующие будут делать работу (для этого требуется гуава):
public <F extends Enum<F>> F castByOrdinal(Enum<?> e, Class<F> fClass) {
return Iterators.get(EnumSet.allOf(fClass).iterator(), e.ordinal());
}
Если библиотека Google Guava отсутствует, это можно сделать вручную еще в нескольких строках кода:
public <F extends Enum<F>> F castByOrdinal(final Enum<?> e, final Class<F> fClass) {
final Iterator<F> iter = EnumSet.allOf(fClass).iterator();
int count = 0;
F fValue = null;
while (count <= e.ordinal()) {
if (!iter.hasNext()) {
return null; // Or throw exception if preferred e.g. IndexOutOfBoundsException
}
fValue = iter.next();
count++;
}
return fValue;
}
Пример использования:
Enum2 en2 = castByOrdinal(Enum1.ONE, Enum2.class);
Приведение по именам общих перечисляемых значений
Существует еще один возможный способ приведения между перечислениями, которые имеют одни и те же имена значений:
например:
enum Shape {
TRIANGLE, SQUARE, PENTAGON, HEXAGON, UNKNOWN, NOT_APPLICABLE
}
enum Size {
SMALL, MEDIUM, LARGE, UNKNOWN, NOT_APPLICABLE
}
Это приведение будет работать только для общих значений (т. Е. UNKNOWN
и NOT_APPLICABLE
выше) и может быть выполнено следующим образом:
Size size = Size.valueOf(Shape.UNKNOWN.name());
Это вызовет исключение IllegalArgumentException, если имя значения не существует в целевом перечислении. На этот раз универсальный метод может быть немного проще:
public <F extends Enum<F>> F castByName(final Enum<?> e, final Class<F> fClass) {
return F.valueOf(fClass, e.name());
}
Пример использования:
Size size = castByName(Shape.UNKNOWN, Size.class);