如何使枚举子类继承其中的其他类,它将包含枚举值?

时间:2012-10-04 16:35:19

标签: java enums

  

可能重复:
  Java extend enum

我想要的是一些类,它包含来自枚举的所有方法以及我自己的方法,例如

public class enum_with_shift extends enum{
    public enum_with_shift next(){
        ...
    };
}

但你无法扩展枚举 我想用它来创造类似的东西:

public class Days_of_week extends enum_with_shift{
    MONDAY, TUESDAY, ...
}

public class Months extends enum_with_shift{
    JANUARY, ...
}

我该怎么做?

3 个答案:

答案 0 :(得分:3)

每个枚举都有一个ordinal,因此获取所有枚举的“下一个”值是有效的 - 而不仅仅是那些尝试使用基类的值。这意味着您可以编写以下帮助方法:

public static <T extends Enum<T>> T getNext(T current) {
    Class<T> enumType = current.getDeclaringClass();
    T[] enumConstants = enumType.getEnumConstants(); // Similar to e.g. Day.values()

    int currentOrdinal = current.ordinal();
    int nextOrdinal = currentOrdinal + 1;
    if (nextOrdinal == enumConstants.length) { // Handle wrapping around to the beginning of the enum values
        nextOrdinal = 0;
    }

    return enumConstants[nextOrdinal];
}

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public enum Month  {
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}

public static void main(String... args) {
    System.out.println(getNext(Day.MONDAY)); // TUESDAY
    System.out.println(getNext(Day.SUNDAY)); // MONDAY

    System.out.println(getNext(Month.JANUARY)); // FEBRUARY
    System.out.println(getNext(Month.DECEMBER)); // JANUARY
}

如果你真的想不能为所有枚举执行此操作(可能对于没有严格排序的枚举没有意义),那么您可以应用标记接口,如下所示:

public interface Ordered {}

public enum Day implements Ordered {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public static <T extends Enum<T> & Ordered> T getNext(T current) {
    ...
}

您可以找到有关反思使用枚举here的更多详细信息。

答案 1 :(得分:1)

由于我不知道enum_with_shift是什么,所以我无法直接回答您的问题。

但你是对的。你无法扩展枚举。原因是enum只是一个扩展java.lang.Enum的常规类。由于java中没有多重继承,因此无法扩展任何其他类。

我建议您使用常规课程或直接扩展java.lang.Enum。 看看我的文章:http://java.dzone.com/articles/enum-tricks-dynamic-enums 我给出了一个如何做到这一点的例子。

答案 2 :(得分:0)

上面的答案是正确的转到上面帖子中的链接,它会告诉你如何做。

当一个类有一个is-a关系时使用extends它只能用一个东西来使用implements来确保ab就像一个断言类似行为的关系实现了“方法”

单独使用它们你不需要扩展你能想象的所有东西它们都定义了一个定义一天的类型,另一个定义了一个月的状态。 您现在可以在名为Date的第三个类中使用这两个枚举。

public enum Day {
MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY
}

public enum Month {     
JANUARY,FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER
}