Я не сильно ошибусь, если предположу, что этой особенностью языка мало кто активно пользуется.
Кто не помнит, что это такое, можете прочитать.
Здесь .
Я приду на практику.
Столкнулся с проблемой: мне нужно отправить уже существующее событие (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
-
Гиббс, Джозия Уиллард
19 Oct, 24 -
Форумы Открываются На Русском Msdn!
19 Oct, 24 -
Отображать Комментарии И Блоги
19 Oct, 24