2014-02-11 20 views
2

我目前正试图利用Java中的观察者模式的通用实现我发现似乎工作得很好,除了它生成未经检查的调用警告,我会如果可能的话要修复。实施看起来是这样的: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); 
} 

My Observable class 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(“未登记”)?或者,我甚至应该这样,事实上,一个安全的方法调用?

回答

3

对于Subject,您没有在extends子句中为Observable提供类型参数。既然你在类中声明Observable<T>,应声明:

public class Subject extends Observable<Subject> { 
    ... 
} 
+0

这样做:)我知道我不得不在某处丢失。我很高兴这很简单。 – qwertymodo

3

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

1)通过提供参考类型作为泛型类型参数(例如,扩展泛型)来扩展Observable的泛型。

public class Subject extends Observable<Foo> 

OR

2)请您Subject类通用了。

public class Subject<T> extends Observable<T> 
+0

主题不会是一个泛型类型,所以'扩展Observable '做了伎俩 – qwertymodo

相关问题