(Извините за титул, я не мог придумать ничего лучшего)Java генерик - Тип неважного
Я работаю над большим проектом, заполненных ссылками на сырье типов, и я пытаюсь избавиться из них. Проблема в том, что в большинстве случаев мы действительно не знаем фактического типа. Пример, вероятно, лучший способ объяснить.
Рассмотрим:
public interface Event<S, D> {
S getSource();
D getData();
}
public interface Listener<E extends Event<?, ?>> {
void onEvent(E event);
}
public interface Listenable<E extends Event<?, ?>> {
void addListener(Listener<E> listener);
void removeListener(Listener<E> listener);
}
public class DataAccess implements Listenable {
...
public void addListener(final Listener listener) {
eventHandler.addListener(listener);
}
public void removeListener(final Listener listener) {
eventHandler.removeListener(listener);
}
}
DataAccess на самом деле не волнует, какой тип слушателя мы проходим, как он может получать события с различными типами. Я подозреваю, что дженерики используются здесь не так, и, возможно, Listener и Listenable не должны быть общими?
Я думал об изменении Слушатель к
public interface Listener {
void onEvent(Class<? extends Event<?, ?>> event);
}
Но тогда OnEvent не будет иметь доступ к методам мероприятия.
Я что-то упустил?
Не можете ли вы просто сменить подпись 'addListener' и' removeListener' на 'public void addListener (final Listener > listener)'? – marstran
'DataAccess' * должен заботиться *, поскольку он обещает доставить определенный тип' X' в 'Listener' и ничего больше. Все остальное должно считаться сломанным (и будет тормозить во время выполнения). Или, ну, вы удаляете общий тип параметра из «Listener» и «Listenable». Но почему вы меняете тип параметра от 'Event' до' Class' выше меня. –
Holger
Если вам действительно не нужны параметры Event на этом уровне, то почему бы не создать суперкласс без этих генериков fe: «Событие» <- «DataEvent
», а затем вы не загрязняете модель прослушивателя с параметрами, которые не используются. –