2012-07-15 19 views
6

Zakładając, że mam podstawową enum jak:Java: Generic akceptujące tylko typy enum

public enum Color { Red, Green, Blue} 

Jak można napisać rodzajowe klasy który akceptuje tylko „klasy enum”, tak że beton instancji tej klasy generycznej może wyglądać jak MyClass<Color>?

Edit:

Co właściwie chcesz zrobić, to napisać rodzajowego klasa abstrakcyjna zawierający funkcję powracającego wszystkie enum "wpisy" w formie listy:

public abstract class EnumListBean<E extends Enum<E>> { 

    public List<E> getEnumList() { 
     return Arrays.asList(E.values()); 
    } 

} 

Podczas Day.values() jest dostępny E.values() jest nie. Co robię źle tutaj?

+0

Nie jego realizacja nie powinna być ograniczona do jednego konkretnego typu enum ale do dowolnych typów enum. Po prostu użyłem słowa 'Day', aby konkretniej opisać to, czego chcę. – Paranaix

Odpowiedz

5
public class EnumAcceptor<E extends Enum<E>> { 
    ... 
} 

korzystać z poczty e jako rodzaj wewnątrz swojej klasie.

1

Naprawdę deklaruje klasę pochodną od . Jako takie, można użyć:

public class MyClass<T extends Enum> { } 
+2

Zmieszacie typy ogólne i surowe. –

4

Zobacz Istvan Devai, aby uzyskać odpowiedź na oryginalne pytanie.

W przypadku dalszych działań, metody takie jak values() są metodami statycznymi, więc nie masz szczęścia, próbując uzyskać to od ogólnego parametru. Jako złe rozwiązanie możesz przekazać obiekt enum do obiektu Class do konstruktora. i użyj Class.getEnumConstants. Ale równie dobrze możesz przekazać MyEnum.values() do konstruktora, a nie do klasy, więc unikaj refleksji. To prawdziwy wstyd, nie ma sensownego metaclassu enum.

0

Pamiętaj, że @ Istvan może przyjmować tylko elementów z enum, co jest w porządku, jeśli to wszystko, co chcesz.

Mimo, że nie może przejść enum się jako parametr (bo w rzeczywistości nie mają odpowiednika obiektu) można określić, które muszą pojawić się class z enum w konstruktorze i czerpać dane tejże enum „sz, że:

public class EnumAcceptor<E extends Enum<E>> { 
    public EnumAcceptor(Class<E> c) { 
    // Can get at the enum constants through the class. 
    E[] es = c.getEnumConstants(); 
    } 

    enum ABC { 
    A, B, C; 
    } 

    public static void main(String args[]) { 
    EnumAcceptor<ABC> abcAcceptor = new EnumAcceptor<ABC>(ABC.class); 
    } 
} 
+0

Ups - duplikat postu @ Toma - przepraszam Tom :( – OldCurmudgeon

0

nie można używać E.values() ze względu na typ skasowaniem - rodzaj E nie jest dostępna w czasie wykonywania.

W szczególnym przypadku w swoim pytaniu, jesteś prawdopodobnie lepiej wyłączyć za pomocą Guava „s Lists.newArrayList:

List<Color> days = Lists.newArrayList(Color.values());