У меня все еще есть проблемы с некоторыми угловыми случаями в java generics system.перечисления и общие методы в java
У меня есть этот метод (я заинтересован только в подписи):
interface Extractor<RETURN_TYPE> {
public <U extends Enum<U>> RETURN_TYPE extractEnum(final Class<U> enumType);
}
(думать об интерфейсе которого реализации иногда извлекает EnumSet иногда реализацию экстракт JComboBox и т.д.)
и я хочу, чтобы назвать это с классом, полученным во время выполнения, так что я просто называю это так:
public static <RETURN_TYPE> RETURN_TYPE extractField(final Extractor<RETURN_TYPE> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(/* error here*/type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
и я получаю сообщение об ошибке странное: несовместимых типов найдено: java.lang.Object требуется: возвращаемый_тип
расположения сообщения, если сразу после открытия Braket вызова, до «Т» типа.
, если я называю это из необщего контексте, это работает:
Integer extractField(final Extractor<Integer> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
ли кто-нибудь есть объяснение и решение этой проблемы, пожалуйста?
Вот полный файл для людей, желающих играть с ним:
public class Blah {
interface Extractor<RETURN_TYPE> {
public <U extends Enum<U>> RETURN_TYPE extractEnum(final Class<U> enumType);
}
public static <RETURN_TYPE> RETURN_TYPE extractField(final Extractor<RETURN_TYPE> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(/* error here*/type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
public static Integer extractField(final Extractor<Integer> extractor, final Field field) {
final Class<?> type = field.getType();
if (type.isEnum())
return extractor.extractEnum(type.asSubclass(Enum.class));
throw new RuntimeException("the rest of the visitor is not necessary here");
}
}
заранее спасибо,
Нико
Ваш вопрос напоминает мне старый мультфильм из арахиса. Линус: «Я думаю, что мой язык не работает! Я пытаюсь сказать brlalalala, но всегда выходит брзазазаа!» Люси: «Я думаю, что вся твоя голова не работает». –
Я должен сказать ... без компилятивного примера игрушек (у которого нет бессмысленных абстракций), это очень сложно понять. –
Джонатан> Весь смысл в том, что он не компилируется. Я добавлю полный класс. – nraynaud