Следующий код компилирует (и запускает тесты, как и ожидалось) в Eclipse:Расхождение между компилятором Eclipse, и JAVAC - Перечисления, интерфейсы и дженерики
import java.util.EnumSet;
public class EnumTest {
static enum Cloneables implements Cloneable {
One, Two, Three;
}
public <T extends Cloneable> T getOne(Class enumType) {
EnumSet<? extends T> set = EnumSet.allOf(enumType);
return set.iterator().next();
}
}
Однако компиляции либо javac
(JDK 7) непосредственно или через Maven не может со следующей ошибкой:
type argument ? extends T is not within bounds of type-variable E
Чтобы быть честным, сложность перечислений + интерфейсы + тип-параметры (генерики) все в игре сразу же бросил меня, как я пишу код, но я думал, наконец, понял.
Цель состоит в том, чтобы написать вызывающий код как это:
Cloneable something = enumTest.getOne(Cloneables.class);
Например, в Eclipse, следующий тест собирает и передает:
@Test
public void testGetFirst() {
assertSame(Cloneables.One, getOne(Cloneables.class));
}
Есть улики, о которых является «правильным,» Затмение или javac, оцениваются.
Также понятный, какие-либо советы о альтернативных путях реализации идеи: взять класс как метод пары, которые могут быть использованы в EnumSet.allOf()
и что также определяют тип объектов Enum в EnumSet
Кстати , не стоит критиковать цель этого метода; Я уменьшил его из более полезного/содержательного кода. Мне не интересно обсуждать достоинства «найти первый элемент из типа enum» - это не вопрос этого вопроса.
оказывается, что это может быть ошибка в JAVAC (JDK 1.7.0_60). Принятый ниже ответ - это обход (и на самом деле более чистый код). См. Подробный анализ на https://bugs.eclipse.org/bugs/show_bug.cgi?id=456459#c7 –