2012-10-04 108 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反思工作的一些細節。