Практическое Использование Множественных Ограничений В Java

Я не сильно ошибусь, если предположу, что этой особенностью языка мало кто активно пользуется.

Кто не помнит, что это такое, можете прочитать.

Здесь .

Я приду на практику.

Столкнулся с проблемой: мне нужно отправить уже существующее событие (GWT) при нажатии кнопки, но перед его отправкой нужно добавить атрибут (Command).

Казалось бы, причем здесь шаблоны.

Вот с чем это связано: Сам метод создания кнопки тривиален, команда — это поле класса:

  
  
  
  
   

Component createEventLink(String link, final Event<?> event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { //event.setCommand(command); bus.fire(event); } }); return new WidgetComponent(button); }

Проблема в строке:

//event.setCommand(command);

Объект Event не имеет такого метода.

Решение кажется очевидным: наследовать наши события от промежуточного класса CommandEvent, у которого будет этот метод и который унаследован от Event. Теперь наш метод выглядит так:

Component createEventLink(String link, final CommandEvent<?> event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { event.setCommand(command); bus.fire(event); } }); return new WidgetComponent(button); }

Эврика? Ха! Здесь мы обнаруживаем, что одно из наших событий уже унаследовано от другого дочернего класса (например, GwtEvent) и никак не может наследовать от нашего класса CommandEvent. Следующим шагом является создание интерфейса ICommandEvent с помощью метода setCommand(), и каждое из наших событий реализует его.

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

Component createEventLink(String link, final Event event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { if (event instanceof ICommandEvent) { ((ICommandEvent) event).

setCommand(command); } else { throw new IllegalStateException("Only ICommandEvent allowed"); } bus.fire(event); } }); return new WidgetComponent(button); }

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

А теперь пришло время вспомнить тему этой заметки — множественные ограничения, универсальные в Java. С ними наш метод выглядит так:

<E extends Event<?> & ICommandEvent> Component createEventLink(String link, final E event) { TextButton button = new TextButton(link, new SelectHandler() { @Override public void onSelect(SelectEvent e) { event.setCommand(command); bus.fire(event); } }); return new WidgetComponent(button); }

Именно то, что требовалось.

Теги: #java #дженерики #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.