【问题标题】:How to make a enum subclass to inherit other classes from it, which will contain enum values? [duplicate]如何使枚举子类从它继承其他类,其中将包含枚举值? [复制]
【发布时间】:2012-09-25 18:08:06
【问题描述】:

可能重复:
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, ...
}

我该怎么做?

【问题讨论】:

  • 只做一个“HasNext”接口什么的,不是吗?

标签: java enums


【解决方案1】:

每个枚举都有一个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 进行反思性工作的详细信息。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      当一个类具有 is-a 关系时,使用 extends 它只能是一件事

      只需单独使用它们,您就不需要扩展您可以想象的所有内容,它们都定义了一个类型,一个定义了一天,另一个定义了月份的状态。 您现在可以在名为 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
      }
      

      【讨论】:

      • 问题是 - 我想要一个新类,扩展枚举,它将有一些新方法(如获取下一个值等)并使用与该类不同的值创建新的枚举。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      相关资源
      最近更新 更多