Java通用Observer模式实现未选中调用为原始类型

时间:2014-02-11 21:33:40

标签: java unchecked

我目前正在尝试利用Java中观察者模式的通用实现我发现它似乎工作得很好,除了它生成未经检查的调用警告,如果可能的话我想修复它。实现如下:

接口,IObservable.java:

public interface IObservable<T> {
    void addObserver(IObserver<T> observer);
    void removeObserver(IObserver<T> observer);
}

基类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);
            }
        }
    }
}

观察者接口IObserver.java:

public interface IObserver<T> {
    void notify(T model);
}

我的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);
    }
}

每次调用notifyObservers时都会发出未经检查的调用警告。完整的警告是

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

有没有办法解决这个问题,还是应该使用@suppressWarnings(“unchecked”)?或者也许我应该这样甚至,事实上,一个安全的方法调用?

2 个答案:

答案 0 :(得分:4)

您未在Observable的{​​{1}}子句中为extends提供类型参数。由于您在该类中声明了Subject,因此您应该声明:

Observable<T>

答案 1 :(得分:3)

您的Subject类实现Observable类的原始形式。您应该执行以下操作之一:

1)通过提供引用类型作为泛型类型参数来扩展Observable的通用形式,例如

public class Subject extends Observable<Foo>

OR

2)使你的Subject类也通用。

public class Subject<T> extends Observable<T>