2012-07-30 77 views
8

我已經寫了下面的方法通過通用類型枚舉作爲參數(JAVA)

@SuppressWarnings("unchecked") 
protected <E extends Enum<E>> void populateComboWithEnumValues(Combo combo, E enumData, String defaultSelectionValue) { 

    // populate commbo 
    for (Enum<E> enumVal: enumData.getClass().getEnumConstants()) { 
     combo.add(enumVal.toString()); 
    } 

    // select default selection 
    for (Enum<E> enumVal: enumData.getClass().getEnumConstants()) { 
     if(enumVal.toString().equals(defaultSelectionValue)) { 
      try { 
       combo.select((Integer) enumVal.getClass().getMethod("getSelectionIndex").invoke(enumVal)); 
      } catch (IllegalArgumentException e) { 
       LOGGER.debug("an IllegalArgumentException exception occured"); 
      } catch (SecurityException e) { 
       LOGGER.debug("an SecurityException exception occured"); 
      } catch (IllegalAccessException e) { 
       LOGGER.debug("an IllegalAccessException exception occured"); 
      } catch (InvocationTargetException e) { 
       LOGGER.debug("an InvocationTargetException exception occured"); 
      } catch (NoSuchMethodException e) { 
       LOGGER.debug("an NoSuchMethodException exception occured"); 
      } 
     } 
    } 

如何傳遞不同枚舉類型的第二個參數?我知道我沒有創建一個枚舉的實例,但初始化一個枚舉意味着我將傳遞一個單一的值,而不是整個初始化的枚舉,如下所示...其他枚舉也將傳遞給組合特定的相同方法

public enum ServerEnvironmentName { 

    /** 
    * The CFD environment name. 
    * Selection Index 
    */ 
    CFD("CFD", 0), 

    /** 
    * The PIT environment name. 
    * Selection Index 
    */ 
    PIT("PIT", 1), 

    /** 
    * The SIT environment name. 
    * Selection Index 
    */ 
    SIT("SIT", 2), 

    /** 
    * The DEV environment name. 
    * Selection Index 
    */ 
    DEV("DEV", 3); 

    /** The input string to identify the environment. */ 
    private String envURL; 

    /** The index value for view selection.*/ 
    private int selectionIndex; 

    /** 
    * Enum constructor to initialise default values. 
    * 
    * @param selectionIndex index value for view selection 
    * @param envURL input parameter for environment 
    */ 
    ServerEnvironmentName(String envURL, int selectionIndex) { 
     this.envURL = envURL; 
     this.selectionIndex = selectionIndex; 
    } 

    /** 
    * Getter for the envURL. 
    * 
    * @return the environment string 
    */ 
    public String getEnvironmentUrl() { 
     return envURL; 
    } 

    /** 
    * This method returns the index of the enum value. 
    * 
    * @return the selection index 
    */ 
    public int getSelectionIndex() { 
     return selectionIndex; 
    } 
} 

回答

40

你可能想傳遞類,而不是一個枚舉實例:

protected <E extends Enum<E>> void populateComboWithEnumValues(Combo combo, Class<E> enumClass, String defaultSelectionValue) {...} 

在這裏你有一個使用示例:

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