Y
yancheng.cheok
Initially, I thought the introduce of generics in Java would solve me
some problem in pattern design. Here, I make use of generic to design
Observer/Subject pattern.
public interface Observer<S, A> {
public void update(S subject, A arg);
}
public class Subject<S, A> {
public void attach(Observer<S, A> observer) {
observers.add(observer);
}
void notify(S subject, A arg) {
for (Observer<S, A> obs : observers) {
obs.update(subject, arg);
}
}
private List<Observer<S, A>> observers = new
CopyOnWriteArrayList<Observer<S, A>>();
}
However, due to the limitation of generics causes by erasure, I am
unable to have two different instantiations with same generics
interface
http://angelikalanger.com/GenericsF...tiations of the same parameterized interface?
Compiler will complain if I tend to make an Object act as more than
one type of Observer.
public class MainFrame extends javax.swing.JFrame implements
org.yccheok.jstock.engine.Observer<RealTimeStockMonitor,
java.util.List<org.yccheok.jstock.engine.Stock>>,
org.yccheok.jstock.engine.Observer<StockHistoryMonitor,
StockHistoryServer>
Currently, my workaround for this is using
public class MainFrame extends javax.swing.JFrame implements
org.yccheok.jstock.engine.Observer<Object, Object>
and performing instanceof checking (to check whether it is
RealTimeStockMonitor or StockHistoryMonitor) during runtime.
I had gone through severals articles :
http://www-128.ibm.com/developerworks/java/library/j-jtp01255.html
http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html
http://gafter.blogspot.com/2006/11/reified-generics-for-java.html
Till now, I still do not have any better workaround, in order to have
a typed-safe Observer/ Subject pattern. Can anyone of you share your
experience, how do you overcome this situation?
Thank you very much!
some problem in pattern design. Here, I make use of generic to design
Observer/Subject pattern.
public interface Observer<S, A> {
public void update(S subject, A arg);
}
public class Subject<S, A> {
public void attach(Observer<S, A> observer) {
observers.add(observer);
}
void notify(S subject, A arg) {
for (Observer<S, A> obs : observers) {
obs.update(subject, arg);
}
}
private List<Observer<S, A>> observers = new
CopyOnWriteArrayList<Observer<S, A>>();
}
However, due to the limitation of generics causes by erasure, I am
unable to have two different instantiations with same generics
interface
http://angelikalanger.com/GenericsF...tiations of the same parameterized interface?
Compiler will complain if I tend to make an Object act as more than
one type of Observer.
public class MainFrame extends javax.swing.JFrame implements
org.yccheok.jstock.engine.Observer<RealTimeStockMonitor,
java.util.List<org.yccheok.jstock.engine.Stock>>,
org.yccheok.jstock.engine.Observer<StockHistoryMonitor,
StockHistoryServer>
Currently, my workaround for this is using
public class MainFrame extends javax.swing.JFrame implements
org.yccheok.jstock.engine.Observer<Object, Object>
and performing instanceof checking (to check whether it is
RealTimeStockMonitor or StockHistoryMonitor) during runtime.
I had gone through severals articles :
http://www-128.ibm.com/developerworks/java/library/j-jtp01255.html
http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html
http://gafter.blogspot.com/2006/11/reified-generics-for-java.html
Till now, I still do not have any better workaround, in order to have
a typed-safe Observer/ Subject pattern. Can anyone of you share your
experience, how do you overcome this situation?
Thank you very much!