我目前正在尝试使用 Java 中观察者模式的通用实现,我发现它似乎运行良好,除了它生成未经检查的调用警告,我想尽可能修复。 实现如下所示:
接口,IObservable.java:
public interface IObservable<T> {
void addObserver(IObserver<T> observer);
void removeObserver(IObserver<T> observer);
}
基类可观察.java:
import java.util.ArrayList;
public class Observable<T> implements IObservable<T> {
private final ArrayList<IObserver<T>> observers
= new ArrayList<IObserver<T>>();
public void addObserver(IObserver<T> observer) {
synchronized (observers) {
observers.add(observer);
}
}
public void removeObserver(IObserver<T> observer) {
synchronized (observers) {
observers.remove(observer);
}
}
protected void notifyObservers(final T t) {
synchronized (observers) {
for (IObserver<T> observer : observers) {
observer.notify(t);
}
}
}
}
观察器接口 IObserver.java:
public interface IObserver<T> {
void notify(T model);
}
我的可观察类主题.java:
public class Subject extends Observable {
private int foo;
private int bar;
public int getFoo() { return foo; }
public int getBar() { return bar; }
public void setFoo(int f) {
foo = f;
notifyObservers(this);
}
public void setBar(int b) {
bar = b;
notifyObservers(this);
}
}
未选中的调用警告发生在每次通知观察者的调用上。 完整的警告是
java: warning: [unchecked] unchecked call to notifyObservers(T) as a member of the raw type com.foo.Observable
有没有办法解决这个问题,或者我应该只使用 @suppressWarnings("未选中")? 或者也许我应该这样做,事实上,这是一个安全的方法调用?
您没有在 Subject
的 extends
子句中提供 Observable
的类型参数。由于您在该类中声明了Observable<T>
,因此您应该声明:
public class Subject extends Observable<Subject> {
...
}
您的Subject
类实现了Observable
类的原始形式。 您应该执行以下操作之一:
1) 通过提供引用类型作为泛型类型参数来扩展Observable
的泛型形式,例如
public class Subject extends Observable<Foo>
或
2)使你的Subject
类也通用。
public class Subject<T> extends Observable<T>