我正在使用 wicket,构建一组解耦组件。在使用事件驱动机制让组件进行通信时,我在“GenericComponent”类中保留了一个 Set。基本思想是发送一个事件,将“Someevent.class”作为从 IGenericEvent 扩展的有效负载。然后在 GenericComponent 类的 onEvent 方法中,遍历所有添加到 Set 的事件。如果该类与有效负载匹配,则应执行该事件。
现在一些代码:
通用组件
public class GenericComponent<T> extends GenericPanel<T>
{
//...
protected Set<IGenericEvent>eventSet = new HashSet<IGenericEvent>();
//...
public void addEvent(final IGenericEvent event)
{
boolean result = eventSet.add(event);
if (!result)
{
throw new IllegalArgumentException("Event already added ...");
}
}
@Override
public void onEvent(final IEvent<?> event)
{
for (IGenericEvent e : eventSet)
{
if (e.getClass().equals(event.getPayload()))
{
e.action(this.getContainer());
}
}
update();
}
}
通用事件
public interface IGenericEvent
{
public void action(final WebMarkupContainer container);
}
隐藏事件
public class Hide implements IGenericEvent, Serializable
{
private static final long serialVersionUID = 1L;
@Override
public void action(WebMarkupContainer container)
{
container.setVisible(false);
}
}
问题:
如果我如前所述定义实现 IGenericEvent 的 onAction 事件,则一切正常。
问题是当我在它自己的页面中做它时,作为接口的匿名实现。然后,该类将是 PageSomething$1,2,3。
errorMessage.add(new Hide()
{
private static final long serialVersionUID = 1L;
@Override
public void onAction(Component component)
{
System.out.println("here");
}
});
我已经尝试过 isAsignableFrom 和 Class.isIntance,但它确实有意义;匿名实现的类是 PageSomething。所以 isAsignableFrom 或 isInstance 不会适用。
我拒绝相信我应该使用一些泛型来获得实际使用的类/接口。就像是
AbstractEvent<Hide>.
我希望你们明白这个问题。
提前致谢。