2012-07-11 13 views
16

Ich habe eine Methode, auf der ich eine enum als Parameter übergeben muss.Wie man einen Methodenparameter als enum deklariert

public <T> T doSomething(SomeEnum operation, Class<T> something); 

Ich habe mehrere enums und das Verfahren ist ein allgemeines, die mit irgendwelchen enums funktionieren sollte. Wie kann diese Methodensignatur korrekt geschrieben werden, um generische Aufzählungstypen zu akzeptieren? Ich weiß, dass ich eine Marker-Schnittstelle zu diesem Zweck verwenden kann, aber ich möchte es mit generischen Enum-Signaturen schreiben. Bitte teilen Sie mir dies mit.

Was ist die schlechte Idee mit dem folgenden: (Es funktioniert, aber ich bekomme Warnungen von der IDE sagen, es ist ein roher Typ. Ich bin nicht klar über den Grund).

public void doSomething(Enum operation); 

Antwort

30
public <E extends Enum<E>> void doSomething(E operation); 

EDIT: Ein Beispiel nach Ihren Änderungen:

public class Main { 

    public enum Day { 
     SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
     THURSDAY, FRIDAY, SATURDAY 
    } 

    public <E extends Enum<E>> E doSomething(E operation, Class<E> klazz) { 

     return operation; 
    } 

    public static void main(String[] args) { 

     new Main().doSomething(Day.FRIDAY, Day.class); 
    } 

} 

EDIT2:

wenn Sie T und die Enum als getrennte Arten benötigen, dann werden Sie brauchen:

public <T, E extends Enum<E>> T doSomething(E operation, Class<T> klazz) { 
+0

Das ist der Weg zu gehen. Siehe auch EnumSet für ein Beispiel in Aktion: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html – Zarkonnen

+0

Hallo, Danke für die Antwort, aber ich konnte nicht t Fügen Sie diesen Teil hinzu, da er sich erneut über Signaturprobleme beschwert. Es tut mir leid, dass ich die genaue Signatur gepostet habe, die ich suche. Bitte beachten Sie meine Bearbeitung der bestehenden Methodensignatur, zu der ich hinzufügen muss, was Sie erwähnt haben. Wie sieht die Methodensignatur in diesem Fall aus? – popcoder

+1

Ist das wonach Sie suchen? oder T und die enum sollten getrennte Typen sein? –

10

könnten Sie tun:

public void doSomething(final Enum<?> operation); 

, die sagt, dass es eine Enumeration zu sein braucht, aber keine spezifischen.

+0

Zur Verdeutlichung: Dies wird im Grunde nur die Warnung los (weil "Enum" und "Enum " sind das gleiche, aber man ist explizit darüber). –

+1

@ BrendanLong: 'Enum' und' Enum 'sind nicht dasselbe. z.B. Sie können Dinge zu einer 'Liste' hinzufügen, aber Sie können nichts zu einer' Liste hinzufügen ' – newacct

0

Dieser ist mehr geklärt:

public class EnumTest { 

    protected static <E extends Enum<E>> void enumValues(Class<E> enumData) { 
     for (Enum<E> enumVal: enumData.getEnumConstants()) { 
      System.out.println(enumVal.toString()); 
     } 
    } 

    public static enum TestEnum { 
     ONE, TWO, THREE; 
    } 

    public static void main(String param []) { 
     EnumTest.enumValues(EnumTest.TestEnum.class); 
    } 
} 
Verwandte Themen