Я создаю что-то подобное, и меня поразило использование дженериков в java.
Идея: Producer производит что-то типа T, а consumers содержит объекты-команды, объекты-команды содержат разные посредники. Медиаторы содержат объекты типа Subject и обновляют значения типа T.
Примечание: я делаю это, чтобы понять, как работают дженерики с точки зрения наследования универсальных типов и состава определений параметров типов в интерфейсах универсальных типов и конкретных классах, поэтому, пожалуйста, не беспокойтесь о логике дизайна.
Определения интерфейсов:
Сочинение:
IObserver
ISubject, который содержит объект типа T и IObserver.
IMmediator содержит объекты типа ISubject и типа T.
ICommand содержит объекты типа IMediator и типа T.
IProducerConsumer содержит объекты типа T и ICommand.
Есть несколько конкретных объектов для соответствующих интерфейсов. Я определил такие интерфейсы:
public interface IObserver<T>
public interface ISubject<T,O extends IObserver<T>>
Круто до сих пор. Но теперь начались проблемы.
public interface IMediator<T,S extends ISubject<T,O>, O extends IObserver<T>>
Компилятор заставляет меня сделать это. Я имею в виду O extends IObserver<T>
как указано выше. Итак, я сделал вывод, что не могу определить, как показано ниже
public interface IMediator<T,S extends ISubject<T,O extends IObserver<T>> >
Я пришел к выводу: это определение параметра внутреннего типа не должно быть расширено, как указано выше. Итак, наконец-то доволен публичным интерфейсом IMediator<T,S extends ISubject<T,O>, O extends IObserver<T>>
Теперь в ICommand начался бардак public interface ICommand <T,M extends IMediator<T, ?, ?>>
,
Теперь я поражен, что компилятор не принимает многие из моих возможностей, даже тот вывод, который я сделал, как указано выше. я имею в виду
public interface ICommand <T,M extends IMediator<T, S, o>, S extends ISubject<T, IObserver<T>>,O extends IObserver<T>>
не работает. Я не хочу использовать подстановочный знак пользователя, я хочу сказать компилятору что-то более конкретное.
Мои вопросы:
Верен ли мой вывод, как в определении ICommand.
Как интерпретировать приведенные выше тематические исследования.
Каковы наилучшие определения, если я хочу вставить T и должен иметь возможность получить и поставить.
Каковы правила и отношения определений параметров типа в интерфейсе и реализованных классах.
Пожалуйста, объясни ?
public interface ICommand<T, M extends IMediator<T, S, O>, S extends ISubject<T, O>, O extends IObserver<T>>
работает. Но на самом деле: обычно такое большое количество параметров типа не требуется. Поскольку это очень вымышленно, я не могу сказать вам прямо сейчас, как уменьшить параметры типа. Может еще раз поясните требования (более понятно)? - person Seelenvirtuose   schedule 03.04.2014