2012-10-04 72 views
0

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

我该怎么做?

+0

只需制作一个“HasNext”界面或其他东西,不是吗? –

回答

1

因为我不知道什么enum_with_shift是我无法直接回答你的问题。

但你说得对。你不能扩展枚举。原因是枚举只是一个普通的类,扩展了java.lang.Enum。由于在java中没有多重继承,所以不能扩展任何其他类。

我可以建议你使用普通班或直接延长java.lang.Enum。 看看我的文章:http://java.dzone.com/articles/enum-tricks-dynamic-enums 我举了一个例子如何做到这一点。

0

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

时使用一个类有一个是-的关系只能是东西用一个实现,以确保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 
} 
+0

事情是 - 我想要一个新的类,扩展枚举,这将有一些新的方法(如获取下一个值等),并使用该类的不同值创建新的枚举。 – CrabMan

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反思工作的一些细节。