Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使枚举子类继承它的其他类,这些类将包含枚举值?_Java_Enums - Fatal编程技术网

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

Java 如何使枚举子类继承它的其他类,这些类将包含枚举值?,java,enums,Java,Enums,可能重复: 我想创建的是一个类,它包含来自enum的所有方法,还有我自己的方法,比如 public class enum_with_shift extends enum{ public enum_with_shift next(){ ... }; } 但您不能扩展enum 我想用这个来创造这样的东西: public class Days_of_week extends enum_with_shift{ MONDAY, TUESDAY, ... } p

可能重复:

我想创建的是一个类,它包含来自enum的所有方法,还有我自己的方法,比如

public class enum_with_shift extends enum{
    public enum_with_shift next(){
        ...
    };
}
但您不能扩展enum 我想用这个来创造这样的东西:

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

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

我该怎么做?

因为我不知道带移位的枚举是什么,所以我不能直接回答你的问题

但你是对的。不能扩展枚举。原因是enum只是一个扩展
java.lang.enum
的常规类。因为java中没有多重继承,所以不能扩展任何其他类

我建议您要么使用常规类,要么直接扩展
java.lang.Enum
。 看看我的文章:
我举了一个例子来说明如何做到这一点

由于我不知道带移位的枚举是什么,我无法直接回答您的问题

但你是对的。不能扩展枚举。原因是enum只是一个扩展
java.lang.enum
的常规类。因为java中没有多重继承,所以不能扩展任何其他类

我建议您要么使用常规类,要么直接扩展
java.lang.Enum
。 看看我的文章:
我举了一个例子来说明如何做到这一点

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

使用扩展当一个类有一个is-a关系时,它只能是一件事使用实现来确保ab-is-like-a关系断言类似的行为被实现为“方法”

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

上面的答案是正确的。点击上面帖子中的链接,它会告诉你怎么做

使用扩展当一个类有一个is-a关系时,它只能是一件事使用实现来确保ab-is-like-a关系断言类似的行为被实现为“方法”

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

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

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 static T getNext(T current){
类enumType=current.getDeclaringClass();
T[]enumConstants=enumType.getEnumConstants();//类似于例如Day.values()
int currentOrdinal=current.ordinal();
int nextOrdinal=currentOrdinal+1;
如果(nextOrdinal==enumConstants.length){//句柄环绕到枚举值的开头
次径向=0;
}
返回枚举常量[nextOrdinal];
}
公众普查日{
周一、周二、周三、周四、周五、周六、周日
}
公众普查月{
一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月
}
公共静态void main(字符串…参数){
System.out.println(getNext(Day.MONDAY));//周二
System.out.println(getNext(Day.SUNDAY));//周一
System.out.println(getNext(Month.一月));//二月
System.out.println(getNext(Month.DECEMBER));//一月
}
如果您确实希望不能对所有枚举执行此操作(对于没有严格排序的枚举可能没有意义),则可以应用标记接口,如下所示:

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) {
    ...
}
公共接口有序{}
公共枚举日已订购{
周一、周二、周三、周四、周五、周六、周日
}
公共静态T getNext(T current){
...
}

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

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

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 static T getNext(T current){
类enumType=current.getDeclaringClass();
T[]enumConstants=enumType.getEnumConstants();//类似于例如Day.values()
int currentOrdinal=current.ordinal();
int nextOrdinal=currentOrdinal+1;
如果(nextOrdinal==enumConstants.length){//句柄环绕到枚举值的开头
次径向=0;
}
返回枚举常量[nextOrdinal];
}
公众普查日{
周一、周二、周三、周四、周五、周六、周日
}
公众普查月{
一月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月
}
公共静态void main(字符串…参数){
System.out.println(getNext(Day.MONDAY));//周二
System.out.println(getNext(Day.SUNDAY));//周一
System.out.println(getNext(Month.一月));//二月
System.out.println(getNext(Month.DECEMBER));//一月
}
如果您确实希望不能对所有枚举执行此操作(对于没有严格排序的枚举可能没有意义),则可以应用标记接口,如下所示:

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) {
    ...
}
公共接口有序{}
公共枚举日已订购{
周一、周二、周三、周四、周五、周六、周日
}
公共静态T getNext(T current){
...
}

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

只需创建一个“HasNext”接口或其他什么,不?只需创建一个“HasNext”接口或其他什么,不?问题是-我想要一个新类,扩展枚举,它将有一些新方法(例如获取下一个值等)我需要一个新的类,扩展enum,它将有一些新的方法(比如获取下一个值和