0

重複の可能性:
Java 拡張列挙型

私が作りたいのは、列挙型のすべてのメソッドと独自のメソッドを持つクラスです。

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, ...
}

それ、どうやったら出来るの?

4

3 に答える 3

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) {
    ...
}

列挙型を反射的に操作する方法の詳細については、こちらをご覧ください。

于 2012-10-04T17:46:31.627 に答える
1

何が何だかわからないのでenum_with_shift、あなたの質問に直接答えることはできません。

しかし、あなたは正しいです。列挙型を拡張することはできません。その理由は、enum が拡張する単なる通常のクラスだからjava.lang.Enumです。Java には多重継承がないため、他のクラスを拡張することはできません。

通常のクラスを使用するか、java.lang.Enum直接拡張することをお勧めします。私の記事を見てください: http://java.dzone.com/articles/enum-tricks-dynamic-enums これを行う方法の例を示しました。

于 2012-10-04T16:43:09.940 に答える
0

上記の答えは正解です。上記の投稿のリンクにアクセスすると、その方法がわかります。

クラスがis-関係を持っている場合に使用が拡張されます。これは、abが-likeであることを確認するために使用が実装する1つのものにすぎません。同様の動作をアサートする関係が「メソッド」に実装されます。

それらを別々に使用するだけで、想像できるすべてを拡張する必要はありません。どちらも、1つは日を定義し、もう1つは月の状態を定義するタイプを定義します。これで、Dateと呼ばれる3番目のクラスでこれらの列挙型の両方を使用できます。

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
}
于 2012-10-04T17:01:35.413 に答える