У меня возникла ситуация, когда я получаю enum
из внешней системы и для чего мне нужно вернуть enum
. Два перечислений имеют те же буквенные значения в них:Использование instanceof с Java Enums
// externalEnum is guaranteed not to be null
public static MyEnum enumToEnum(final Enum<? extends Enum<?>> externalEnum)
{
if(externalEnum instanceof MyEnum)
{
return (MyEnum)enumType;
}
else
{
return MyEnum.valueOf(externalEnum.name());
}
}
Однако компилятор визжит следующее:
[javac] found : java.lang.Enum<capture#117 of ? extends java.lang.Enum<?>> [javac] required: myEnum [javac] if(externalEnum instanceof MyEnum)
я получил версию этой функции, которая работает просто возвращение MyEnum.valueOf(externalEnum.name())
- это работает и это все, что имеет значение. Тем не менее, я озадачен ошибкой компилятора.
Я пытаюсь понять процесс овеществления дженериков в этом случае. Экземпляр Enum<? extends Enum<?>>
или просто Enum<?>
может быть MyEnum
(при условии, что впоследствии не может быть ничем иным, кроме подтипа первого.)
Так что тест instanceof
должен работать, но там, кажется, что-то в родовом определении из Enum
(и, возможно, тот факт, что Enums не может быть расширен), что заставляет компилятор пренебрегать этим конкретным утверждением.
Обходной путь для меня прост, но мне нравится хорошо понимать проблемы, и любое понимание этого будет оценено по достоинству.
- Luis.
Ваше сообщение об ошибке содержит строчный «myEnum», но я не вижу строчный «myEnum» в любом месте вашего кода. Где нижний регистр «myEnum», определенный в вашем коде? Что он делает в этой функции? –
Кроме того, является 'return (MyEnum) enumType;' преднамеренным, или это должно быть 'return (MyEnum) externalEnum'? Когда я меняю его, ваш первый пример отлично подходит для меня. – gustafc