2012-07-30 20 views
8

ho scritto il seguente metodopassano tipo enum generico come parametro (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"); 
      } 
     } 
    } 

Come posso passare diversi tipi enum al secondo argomento? So che non posso creare un'istanza di enum, ma inizializzare un enum significa che passerò un singolo valore non l'intero enum inizializzato come segue ... Altre enumerazioni sarebbero anche passate allo stesso metodo per le specifiche Combo

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

risposta

40

probabilmente si desidera passare alla classe, e non un'istanza enum:

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

Qui avete un esempio di utilizzo:

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