que estoy tratando de hacer reverse lookup en algunas clases de enumeración de aplicación misma interfaz Field
por iteración a través de lista de Class
es el uso de guayaba Maps.uniqueIndex
:Uso de medicamentos genéricos con colección de clases de enumeración implementar misma interfaz
Field valueOfSearchName = null;
for (final Class<? extends Enum<?>> clazz : ImmutableList.of(
EntityField.class,
AddressField.class,
PersonFunctionType.class)) {
valueOfSearchName = Fields.valueOfSearchName(clazz, term.field()); // error
if (valueOfSearchName != null) {
// do something...
break;
}
}
no quiero repetir mismo código (para la fabricación de índice y haciendo operaciones de búsqueda) en todas las clases de enumeración, así que usar ayudante de clase estática que contiene Fields
Fields.valueOfSearchName
método:
public static <E extends Enum<E> & Field> Field valueOfSearchName(
final Class<E> clazz, final String searchName) {
// TODO: cache the index
final ImmutableMap<String, E> index = Maps.uniqueIndex(
EnumSet.allOf(clazz), GET_SEARCH_NAME_FUNCTION);
return index.get(searchName);
}
Desafortunadamente, Eclipse muestra un error:
Bound mismatch:
The generic method valueOfSearchName(Class<E>, String) of type Fields is not
applicable for the arguments (Class<capture#1-of ? extends Enum<?>>, String).
The inferred type capture#1-of ? extends Enum<?> is not a valid substitute
for the bounded parameter <E extends Enum<E> & Field>
El problema es Class<? extends Enum<?>> clazz
en fines de cada bucle (no coincidencia de campos), pero no sé cómo hacer frente a este caso (obviamente, no se puede agregar & Field
al clazz
).
Este enlace puede ser útil http://stackoverflow.com/questions/7032941/why-is-this-type-not-a-valid-substitute-for-the-type-parameter – kosa
Eclipse es famoso por estar en desacuerdo con sentido común. Verifique esta publicación: http://stackoverflow.com/questions/2220763/java-specific-enums-and-generic-enum-parameters –
@baba No puedo reemplazar '?' Comodín con el parámetro de tipo nombrado 'T' en cada bucle, donde ocurre el problema ... Sin embargo [inspirado en la respuesta de John Skeet de esta pregunta] (http://stackoverflow.com/questions/5262096/how-do-i-get-the-value-of -an-enum-if-i-dont-know-the-class-at-compile-time) Cambié loop a 'for (@SuppressWarnings (" rawtypes ") final Class clazz: ...' y funcionó ...¿Es la forma correcta de hacer esto? – Xaerxess