Попробуйте это:
public class Observable<U> {
private List<Observer<Observable<U>, U>> _observers =
new ArrayList<Observer<Observable<U>, U>>();
public void addObserver(Observer<Observable<U>, U> obs) {
if (obs == null) {
throw new IllegalArgumentException();
}
if (_observers.contains(obs)) {
return;
}
_observers.add(obs); }
public void notifyObservers(U data) {
for (Observer<? super Observable<U>, U> obs : _observers) {
obs.atualizar(this, data);
}
}
}
interface Observer<T, U> {
public void atualizar(T entity, U arg);
}
Чтобы объяснить основную проблему здесь, дженерики вызывают явное снижение. Таким образом, вы не можете взять Observable для любой реализации U и поместить его в коллекцию, потому что эта коллекция определяется как принимающая определенный тип U, а не что-либо.
Для этого типа использования у дженериков есть ограничения, и вы, возможно, не сможете выполнить то, что вы хотите, таким безопасным способом.
РЕДАКТИРОВАТЬ: Это будет работать для вас?
public class Observable<U> {
private List<Observer<U>> _observers =
new ArrayList<Observer<U>>();
public void addObserver(Observer<U> obs) {
if (obs == null) {
throw new IllegalArgumentException();
}
if (_observers.contains(obs)) {
return;
}
_observers.add(obs); }
public void notifyObservers(U data) {
for (Observer<U> obs : _observers) {
obs.atualizar(this, data);
}
}
}
interface Observer<U> {
public void atualizar(Observable<U> entity, U arg);
}