2011-01-23 10 views
8

Tengo una pregunta sobre los genéricos. Tengo este método que no compila en absoluto. El compilador me dice: type parameter E is not within its bound. Normalmente no tengo problemas para entender los errores del compilador, pero este es bastante complicado. Tal vez mi conocimiento sobre los genéricos necesite mejorar. :-) ¿Alguien puede decirme qué está mal?Java Generics Pregunta: escriba el parámetro E no está dentro de su límite

public static <E extends Enum & StringConvertableEnum<E>> Map<String, E> map(Class<E> enumClass) { 
    Map<String, E> mapping = new HashMap<String, E>(); 

    EnumSet<E> set = EnumSet.allOf(enumClass); 

    for(E enumConstant : set) { 
     mapping.put(enumConstant.getStringValue(), enumConstant); 
    } 

    return mapping; 
} 

Esta es la definición de StringConvertableEnum:

public interface StringConvertableEnum<E extends Enum> { 
    public E getEnumFromStringValue(String string); 
    public String getStringValue(); 
} 
+0

número de línea a la que se está quejando? – bmargulies

+0

@bmargulies: EnumSet set = EnumSet.allOf (enumClass); es la linea – Kraushauslaus

+0

Estoy fuera de mi profundidad. Tu código parece plausible para mí. – bmargulies

Respuesta

9

Usted necesita cambiar su declaración a E extends Enum<E>

Editar, siento que dar un paso de distancia, la declaración completa que quiero decir es:

public static <E extends Enum<E> & StringConvertableEnum<E>> Map<String, E> map(Class<E> enumClass) { 
+0

i) Esto permitiría pasar enums sin el método 'getStringValue()', que es obligatorio. ii) tampoco compila, incluso si elimino el cuerpo del for-loop donde se usa el método 'getStringValue()'. – Kraushauslaus

+0

@Kraushauslaus: quiere decir el cambio 'E extiende Enum' a' E extiende Enum ': puede conservar su parte' StringConvertableEnum '. –

+1

@Kraushauslaus Creo que @Yishai significa insertar el '' en ambas declaraciones y no eliminar nada. Compila para mi –