Próbuję zrobić reverse lookup na kilka klas enum wykonawczych samą Field
interfejs przez iteracja listy Class
es użyciu Guava na Maps.uniqueIndex
:Korzystanie rodzajowych z kolekcji klas enum realizacji tego samego interfejsu
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;
}
}
nie chcę powtarzać tego samego kodu (do tworzenia indeksu i robi odnośnika) we wszystkich klasach enum, więc używam pomocnika statyczną klasę Fields
zawierający Fields.valueOfSearchName
metody:
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);
}
Niestety, Eclipse pokazuje błąd:
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>
Problem polega Class<? extends Enum<?>> clazz
w for-each pętli (nie pasujące pola), ale nie wiem, jak radzić sobie z tego sprawy (oczywiście ja nie można dodać & Field
do clazz
).
Ten link może być pomocny http://stackoverflow.com/questions/7032941/why-is-this-type-not-a-odpowiedni-substitute-for-the-type-parametr – kosa
Eclipse słynie z niezgadzania się z zdrowy rozsądek. Sprawdź ten wpis: http://stackoverflow.com/questions/2220763/java-specific-enums-and-generic-enum-parameters –
@baba Nie mogę zastąpić symbolu wieloznacznego '?' Nazwanym parametrem typu 'T' w pętli for-each, gdzie pojawia się problem ... Jednak [inspirowany przez Johna Skeeta odpowiedź na to pytanie] (http://stackoverflow.com/questions/5262096/how-do-i-get-the-value-of -an-enum-if-i-dont-know-the-class-at-compile-time) Zmieniłem pętlę na 'for (@SuppressWarnings (" rawtypes ") final Class clazz: ...' i to wystarczyło ...Czy to właściwa droga? – Xaerxess