我正在寻求实现一个主题观察者模式,其中主题在通知时向观察者提供自己。
public class Subject<T extends Subject> {
/** suporting stuff for subject */
private List<Observer<T>> observers = new ArrayList<>();
protected void doNotify() {
for(Observer<T> observer : observers) {
/** This is the line where it gets interesting */
observer.update((T)this);
}
}
}
然而,实际上,这项工作,编译器在线上给出了Unchecked cast警告observer.update((T)this);
。
当阅读一点关于此的内容时,编译器是正确的(出乎意料),它甚至被认为是臭代码,因为您可以编写实际触发ClassCastException的代码。
现在我正在寻找一种不臭且坚如磐石的解决方案。然而,观察者不需要寻找它正在观察的主题的想法是我非常喜欢的。另外,我真的不喜欢观察者需要自己在他们的update()
. 你对如何使用这个有什么建议吗?
编辑
我的观察者被声明为这样的接口:
public interface Observer<T> {
void update(T subject);
}