Generics 是否可以生成通用方面?

Generics 是否可以生成通用方面?,generics,aop,aspectj,Generics,Aop,Aspectj,例如,这个观察者模式 可以这样写吗 public abstract aspect ObserverProtocol<S implements Subject, O implements Observer> { // ... protected abstract pointcut subjectChange(S s); protected abstract void updateObserver(S subject, O observer); } 公共抽象方面obser

例如,这个观察者模式

可以这样写吗

public abstract aspect ObserverProtocol<S implements Subject, O implements Observer> {
  // ...
  protected abstract pointcut subjectChange(S s);
  protected abstract void updateObserver(S subject, O observer);
}
公共抽象方面observer协议{
// ...
受保护的抽象切入点主题更改;
受保护的抽象无效更新观察者(S主题,O观察者);
}

是的,通用抽象方面是可能的,请参阅。你会发现一个很有启发性的例子。如果你需要更多的帮助,给我一个信号


更新作为对您下面问题的回应:在这种情况下,我认为对观察者模式使用泛型没有多大价值,但这是可能的,需要一些重构。我克隆了repo,并对代码进行了一些重构。现在它是这样读的(对不起,这会很长!)

包ca.ubc.cs.spl.aspectPatterns.patternLibrary;
导入java.util.WeakHashMap;
导入java.util.List;
导入java.util.LinkedList;
导入java.util.Iterator;
公共抽象方面观察者协议{
私有WeakHashMap PersubjectObservators=
新WeakHashMap();
受保护的列表(主题){
List Observators=persubjectObservators.get(subject);
如果(观察员==null){
观察员=新的LinkedList();
persubjectobservators.put(受试者,观察者);
}
返回观察员;
}
公众观察员(S主体,O观察员){
获取观察者(受试者)。添加(观察者);
}
公共无效移除观察者(S主体,O观察者){
获取观察者(受试者)。移除(观察者);
}
受保护的抽象切入点主题更改;
主题后:主题更改(主题){
迭代器iter=getobsers(subject.Iterator();
while(iter.hasNext())
updateObserver(subject,iter.next());
}
受保护的抽象无效更新观察者(S主题,O观察者);
}
包ca.ubc.cs.spl.aspectPatterns.patternLibrary;
公共接口主题{}
包ca.ubc.cs.spl.aspectPatterns.patternLibrary;
公共接口观察器{}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
导入java.awt.Color;
公共课点{
私人INTX;
私营企业;
私人色彩;
公共点(整数x、整数y、颜色){
这个.x=x;
这个。y=y;
这个颜色=颜色;
}
public int getX(){return x;}
public int getY(){return y;}
公共void setX(int x){this.x=x;}
public void setY(int y){this.y=y;}
公共颜色getColor(){return Color;}
public void setColor(Color Color){this.Color=Color;}
}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
公共类屏幕{
私有字符串名称;
公共屏幕(字符串s){
this.name=s;
}
公共空白显示(字符串s){
System.out.println(name+“:”+s);
}
}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
导入ca.ubc.cs.spl.aspectPatterns.patternLibrary.Subject;
导入ca.ubc.cs.spl.aspectPatterns.patternLibrary.Observer;
公共方面主体观察者声明{
声明父对象:点实现主题;
声明父对象:屏幕执行观察者;
声明父对象:屏幕实现主题;
}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
导入java.awt.Color;
导入ca.ubc.cs.spl.aspectPatterns.patternLibrary.ObserverProtocol;
公共方面ColorObserver扩展了ObserverProtocol{
声明优先级:SubjectObserver声明,ColorObserver;
受保护的切入点主题更改(点主题):
调用(无效点。设置颜色(颜色))&目标(主题);
受保护的void updateObserver(点主题、屏幕观察者){
显示(“屏幕更新(点主题更改颜色)”);
}
}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
导入ca.ubc.cs.spl.aspectPatterns.patternLibrary.ObserverProtocol;
公共方面协调observer扩展了observer协议{
声明优先级:subjectobserver声明,coordinationobserver;
受保护的切入点主题更改(点主题):
(调用(void Point.setX(int))| |调用(void Point.setY(int))&&target(主题);
受保护的void updateObserver(点主题、屏幕观察者){
显示(“屏幕更新(点主体更改坐标)”;
}
}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
导入ca.ubc.cs.spl.aspectPatterns.patternLibrary.ObserverProtocol;
公共方面ScreenObserver扩展了ObserverProtocol{
声明优先级:SubjectObserverDeclarations,ScreenObserver;
受保护的切入点主题更改(屏幕主题):
调用(无效屏幕显示(字符串))&目标(主题);
受保护的无效更新观察者(屏幕主题、屏幕观察者){
显示(“屏幕更新(屏幕主题显示消息)”;
}
}
包ca.ubc.cs.spl.aspectPatterns.examples.observer.aspectj;
导入java.awt.Color;
公共班机{
公共静态void main(字符串argv[]){
系统输出打印LN(“创建屏幕s1、s2、s3、s4、s5和点p”);
点p=新点(5,5,颜色为蓝色);
屏幕s1=新屏幕(“s1”);
屏幕s2=新屏幕(“s2”);
屏幕s3=新屏幕(“s3”);
屏幕s4=新屏幕(“s4”);
屏幕s5=新屏幕(“s5”);
System.out.println(“创建观察关系:”);
System.out.println(“-s1和s2观察p的颜色变化”);
System.out.println(“-s3和s4观察到p的坐标变化”);
System.out.println(“-s5观察s2和s4的显示()方法”);
ColorObserver.aspectOf().addObserver(p,s1);
ColorObserver.aspectOf().addObserver(p,s2);
coordinationobserver.aspectOf().addObserver(p,s3);
coordinationobserver.aspectOf().addObserver(p,s4);
ScreenObserver.aspectOf().addObserver