2014-02-11 173 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