Класс, реализующий интерфейс, который принимает перечисление - PullRequest
2 голосов
/ 14 июля 2009

Итак, скажем, у меня есть простое перечисление и класс, который его использует:

enum ThingType { POTATO, BICYCLE };

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

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

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

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

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

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

Затем подкласс расширяет тот, который имеет правильный тип:

class SomeSubClass implements Thing<ThingType> { ... }
0 голосов
/ 14 июля 2009

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

Возможно, вас заинтересует запрос о том, что Java может иметь абстрактные перечисления .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...