2012-07-11 83 views
16

我有一個方法,我需要傳遞一個枚舉作爲參數。如何聲明一個方法參數爲任何枚舉

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

我有幾個枚舉和的方法是很常見的,應與任何枚舉工作。寫這個方法簽名以接受任何泛型枚舉類型的正確方法是什麼?我知道我可以使用標記接口來達到這個目的,但我想用泛型枚舉簽名來寫它。請告訴我這個。

下面這個壞主意是什麼:(它可以工作,但我從IDE獲得的警告稱它是原始類型,我不清楚原因)。

public void doSomething(Enum operation); 

回答

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

編輯:一個例子,根據您的修改:

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:

如果你需要T和枚舉爲不同的類型,那麼你需要:

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

這就是要走的路。另請參閱EnumSet中有關此操作的示例:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html – Zarkonnen 2012-07-11 14:39:29

+0

嗨,感謝您的回覆,但我無法'不要再添加這部分,因爲它再次抱怨簽名問題。對不起,我應該發佈我正在尋找的確切簽名。請參閱我的編輯現有的方法簽名,我需要添加您提到的內容。在這種情況下,方法簽名將如何顯示? – popcoder 2012-07-12 02:28:35

+1

這是你在找什麼?或T和枚舉應該是不同的類型? – 2012-07-12 06:00:31

10

你可以這樣做:

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

它說,它必須是一個枚舉,但沒有任何具體的一個。

+0

澄清:這基本上只是擺脫了警告(因爲'Enum'和'Enum '是同樣的事情,但一個是明確的)。 – 2012-07-11 14:40:14

+1

@BrendanLong:'Enum'和'Enum '不是一回事。例如你可以添加東西到一個'List',但是你不能添加任何東西到'List ' – newacct 2012-07-11 18:20:57

0

這一個更清楚:

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); 
    } 
}