枚举是否可以子类化以添加新元素?

2022-08-31 04:16:27

我想采用现有的枚举并向其添加更多元素,如下所示:

enum A {a,b,c}

enum B extends A {d}

/*B is {a,b,c,d}*/

这在Java中可能吗?


答案 1

不,你不能在Java中这样做。撇开其他任何东西不谈,那么它可能是一个实例(考虑到“扩展”的正常想法),但是只知道它的用户不会知道它 - 这违背了枚举是一组众所周知的值的观点。dAA

如果您可以告诉我们更多关于您希望如何使用它的信息,我们可能会提出替代解决方案。


答案 2

枚举表示可能值的完整枚举。所以(无益的)答案是否定的。

作为实际问题的一个例子,以工作日,周末和工会为例,一周中的几天。我们可以定义一周中几天内的所有日期,但这样我们就无法表示工作日和周末的特殊属性。

我们可以做的是,有三种枚举类型,在工作日/周末和星期几之间进行映射。

public enum Weekday {
    MON, TUE, WED, THU, FRI;
    public DayOfWeek toDayOfWeek() { ... }
}
public enum WeekendDay {
    SAT, SUN;
    public DayOfWeek toDayOfWeek() { ... }
}
public enum DayOfWeek {
    MON, TUE, WED, THU, FRI, SAT, SUN;
}

或者,我们可以为星期几提供一个开放式界面:

interface Day {
    ...
}
public enum Weekday implements Day {
    MON, TUE, WED, THU, FRI;
}
public enum WeekendDay implements Day {
    SAT, SUN;
}

或者我们可以将这两种方法结合起来:

interface Day {
    ...
}
public enum Weekday implements Day {
    MON, TUE, WED, THU, FRI;
    public DayOfWeek toDayOfWeek() { ... }
}
public enum WeekendDay implements Day {
    SAT, SUN;
    public DayOfWeek toDayOfWeek() { ... }
}
public enum DayOfWeek {
    MON, TUE, WED, THU, FRI, SAT, SUN;
    public Day toDay() { ... }
}