Java通用观察者模式实现未经检查的调用为原始类型

qwe*_*odo 4 java unchecked

我目前正在尝试使用Java中的Observer Pattern的通用实现,除了发现它会生成未经检查的调用警告(如果可能)后,我发现它似乎工作得很好,这似乎工作得很好。实现看起来像这样:

IObservable.java接口:

public interface IObservable<T> {
    void addObserver(IObserver<T> observer);
    void removeObserver(IObserver<T> observer);
}
Run Code Online (Sandbox Code Playgroud)

基类Observable.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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

观察者接口IObserver.java:

public interface IObserver<T> {
    void notify(T model);
}
Run Code Online (Sandbox Code Playgroud)

我的Observable类Subject.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

每次对notifyObservers的调用都会出现未经检查的呼叫警告。完整的警告是

java: warning: [unchecked] unchecked call to notifyObservers(T) as a member of the raw type com.foo.Observable
Run Code Online (Sandbox Code Playgroud)

有什么办法可以解决此问题,还是应该只使用@suppressWarnings(“ unchecked”)?也许我实际上应该是安全的方法调用呢?

Tom*_*m G 6

您没有Observable在的extends子句中提供的类型参数Subject。由于您是Observable<T>在该类中声明的,因此您应该声明:

public class Subject extends Observable<Subject> {
  ...
}
Run Code Online (Sandbox Code Playgroud)