I have made a generic Observer interface and an Observable class, but can't compile my class due to some generics problem. I don't know precisely why what I'm trying to do is forbidden. The code follows:
public class Observable<U> {
private List<Observer<Observable<U>, U>> _observers =
new ArrayList<Observer<Observable<U>, U>>();
public void addObserver(Observer<? extends Observable<U>, U> obs) {
if (obs == null) {
throw new IllegalArgumentException();
}
if (_observers.contains(obs)) {
return;
}
_observers.add(obs); // This line does not compile
}
public void notifyObservers(U data) {
for (Observer<? extends Observable<U>, U> obs : _observers) {
// After correction of the list declaration, this line will not compile
obs.update(this, data);
}
}
}
interface Observer<T, U> {
public void update(T entity, U arg);
}
Change your _observers definition to this:
private List<Observer<? extends Observable<U>, U>> _observers =
new ArrayList<Observer<? extends Observable<U>, U>>();
If you want to allow sublclasses you need to specify this in the declaration, not just in the place you're using it
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With