如果我有一个枚举类:

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()应该由实例调用,但是似乎区别不仅仅在于此?

最佳答案

getClass返回一个Class<? extends WorkDays>,但是Enum.valueOf期望其第一个参数为Class<WorkDays>

要获取正确的类类型,即Class<WorkDays>,可以使用the getDeclaringClass method

WorkDays day2b = Enum.valueOf(day1.getDeclaringClass(), "MONDAY");


现在碰巧day1Workdays,因此您也可以转换为正确的类型:

WorkDays day2b = Enum.valueOf((Class<WorkDays>) day1.getClass(), "MONDAY");


请注意,如果MONDAY具有主体,则此转换将失败(例如,如果它覆盖枚举的方法)。

07-24 19:10