#java #class
#java #класс
Вопрос:
Если у меня есть класс enum:
enum WorkDays {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY;
}
И у меня есть:
WorkDays day1 = WorkDays.valueOf("MONDAY");
для метода:
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
Если я принудительно проверю EnumType, я могу написать:
WorkDays day2 = Enum.valueOf(WorkDays.class,"TUESDAY");
Но это не может быть:
WorkDays day2b = Enum.valueOf(day1.getClass(), "MONDAY");
Большинство людей говорят, что это Object.class
должно вызываться классом, но getClass()
должно вызываться экземпляром, но, похоже, разница заключается не только в этом?
Ответ №1:
getClass
возвращает a, Class<? extends WorkDays>
но Enum.valueOf
ожидает, что его первым аргументом будет a Class<WorkDays>
.
Чтобы получить правильный тип класса, т.е. Class<WorkDays>
, вы можете использовать getDeclaringClass
метод:
WorkDays day2b = Enum.valueOf(day1.getDeclaringClass(), "MONDAY");
Теперь случается, что day1
это Workdays
, поэтому вы также можете привести к правильному типу:
WorkDays day2b = Enum.valueOf((Class<WorkDays>) day1.getClass(), "MONDAY");
Обратите внимание, что это приведение завершится неудачей, если MONDAY
имеет тело (например, если оно переопределяет метод перечисления).
Комментарии:
1. В чем разница между getClass и getDeclaringClass еще раз?
2. Это также было бы моим вопросом, т. Е. не мог бы кто-нибудь объяснить «Значение, возвращаемое этим методом, может отличаться от значения, возвращаемого методом Object.getClass() для констант enum с телами класса, специфичными для константы».?
3. @Code_Control_jxie0755 Заметил, что вы можете переопределить методы, объявленные в классе enum, для некоторых конкретных значений enum? Это реализуется значением enum, определяющим его собственный класс, который расширяет класс enum. Следовательно, для такого значения enum getClass() фактически выдает свой собственный класс, который является подклассом объявляющего класса enum.
4. Спасибо! Неудивительно, что существует
getDeclaringClass
, это в основном для решения проблемы внутреннего класса,5. @Code_Control_jxie0755 В вашем случае они возвращают то же самое во время выполнения. Ваша ошибка во время компиляции, потому что возвращаемый тип
getClass
не соответствует типу аргументаvalueOf
.