Tôi cố gắng để làm reverse lookup trên vài lớp enum thực hiện chuyển đổi giao diện Field
bằng cách duyệt qua danh sách các Class
es sử dụng ổi của Maps.uniqueIndex
:Sử dụng Generics với bộ sưu tập của các lớp enum thực hiện chuyển đổi giao diện
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;
}
}
Tôi không muốn để lặp lại cùng một mã (để làm chỉ mục và làm tra cứu) trong mọi tầng lớp enum, vì vậy tôi sử dụng helper tĩnh lớp Fields
chứa Fields.valueOfSearchName
phương pháp:
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);
}
Thật không may, Eclipse cho thấy một lỗi:
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>
Vấn đề là Class<? extends Enum<?>> clazz
trong for-each vòng lặp (không phù hợp với Field), nhưng tôi không biết làm thế nào để đối phó với trường hợp này (rõ ràng là tôi không thể thêm & Field
đến clazz
).
Liên kết này có thể hữu ích http://stackoverflow.com/questions/7032941/why-is-this-type-not-a-valid-substitute-for-the-type-parameter – kosa
Eclipse nổi tiếng vì không đồng ý với thông thường. Kiểm tra bài đăng này: http://stackoverflow.com/questions/2220763/java-specific-enums-and-generic-enum-parameters –
@baba Tôi không thể thay thế ký tự đại diện '?' Bằng thông số loại có tên 'T' trong vòng lặp for-each, nơi xảy ra sự cố ... Tuy nhiên [lấy cảm hứng từ câu trả lời của John Skeet từ câu hỏi này] (http://stackoverflow.com/questions/5262096/how-do-i-get-the-value-of -an-enum-if-i-dont-know-the-class-at-biên dịch-thời gian) Tôi thay đổi vòng lặp để 'cho (@SuppressWarnings (" rawtypes ") cuối cùng Class clazz: ...' và nó đã làm các trick ...Có đúng cách để làm điều này không? – Xaerxess