[英]Problem with Observer Pattern and generics in Java
我已經制作了一個通用的Observer接口和一個Observable類,但由於一些泛型問題而無法編譯我的類。 我不知道為什么我要做的事情是被禁止的。 代碼如下:
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);
}
將_observers定義更改為:
private List<Observer<? extends Observable<U>, U>> _observers =
new ArrayList<Observer<? extends Observable<U>, U>>();
如果要允許子類,則需要在聲明中指定它,而不僅僅是在您使用它的位置
嘗試這個:
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.