У меня есть общий класс, который представляет фрагмент текста. Этот фрагмент текста может иметь любой из нескольких различных режимов (различные типы выделения). Эти режимы представлены Enum. Enum может отличаться для каждого проекта, но он должен реализовать интерфейс, который обеспечивает метод для объединения двух из них (может быть выделен и выделен полужирным). Итак, у меня есть интерфейс:
public interface TextFragmentMode<E extends Enum<E>> {
/**
* Will combine the supplied mode with the current mode and return the
* result.
*
* @param mode The mode to combine with.
* @return The combined mode.
*/
public E combine( E mode );
}
Затем мой TextFragment является контейнером как для строки текста, так и для режима. Но когда я пытаюсь объявить класс:
public class TextFragment<E extends TextFragmentMode<E extends Enum<E>>> {
StringBuilder text;
E mode;
...
Я получаю следующую ошибку:
Синтаксическая ошибка в токене "extends", ожидается
Что, в соответствии с подсветкой синтаксиса eclipse, относится к
E extends Enum<E>
часть кода. Кто-нибудь знает, что я делаю неправильно? Мне нужно что-то пропустить о Generics...
--------------------- edit -------------------
Наконец-то я нашел время, чтобы прочитать "Эффективную Java" Джоша Блоха (второе издание), и выясняется, что он использует этот прецедент в качестве пункта 34: "Эмулировать расширяемые перечисления с интерфейсами". Столько, сколько я хотел бы сказать, что великий ум думает одинаково... Это было бы ПУТЕМ слишком преувеличенным!