2009-07-14 3 views
2

Так, что у меня есть простое перечисление и класс, который использует это:класса, реализующий интерфейс, который принимает перечисление

enum ThingType { POTATO, BICYCLE }; 

class Thing { 
    public void setValueType(ThingType value) { ... } 
    public ThingType getValueType() { ... } 
} 

Но, на самом деле, у меня есть много разных классов, которые реализуют setValueType, каждый с другим видом перечисления. Я хочу, чтобы сделать интерфейс, что эти классы могут реализовать, что поддерживает setValueType и getValueType с использованием дженериков:

interface ValueTypeable { 
    public Enum<?> getValueType(); // This works 
    public <T extends Enum<T>> setValueType(T value); // this fails horribly 
} 

Я не могу изменить модель класса, потому что классы автоматически генерируется из схемы XML (JAXB). Я чувствую, что я не хватаю перечислений и дженериков вместе взятых. Цель здесь заключается в том, что я хочу, чтобы позволить пользователю выбирать из списка перечислений (как я уже знаю тип во время выполнения) и устанавливать значение в конкретном классе.

Спасибо!

ответ

3

Вы пробовали параметризовать интерфейс. Как:

class Thing<E extends Enum<? extends E>> { 
    public E getValueType(); 
    public void setValueType(E value); 
} 

Тогда у вас есть подкласс расширить один с правом типа:

class SomeSubClass implements Thing<ThingType> { ... } 
+1

Вероятно, нет необходимости беспокоиться о 'Enum' в поле. –

+0

Это определенно работает, но генератор кода для jaxb-интерфейсов не поддерживает обобщенные интерфейсы. Однако это не так сложно исправить. – lucasmo

0

перечисления предназначены для тех случаев, когда у вас есть фиксированный набор из них. Когда вы говорите, что каждая реализация имеет свои собственные, то у вас больше нет фиксированного набора, и как вы пытаетесь использовать перечисления, не соответствует вашим потребностям.

Возможно, вас заинтересует request for Java to be able to have abstract enums.

+0

Ну, каждый класс имеет одно перечисление, что пары с ним - определенно набор фиксированных значений. То, что я хочу, это интерфейс, который могут реализовывать эти классы перечисления, чтобы я мог программно их идентифицировать и вызывать из интерфейса. Альтернативой является тестирование каждого индивидуума, содержащего тип класса, который становится кошмаром ремонтопригодности. – lucasmo

Смежные вопросы