我正在开发一个API,允许用户使用某种协议传输数据。在整个通信过程中,会发生两个事件 - EventA和EventB。 B是可选的,但与A密切相关。它们出现在序列(AB?)*
中。此事件作为对接口的挂钩调用向用户公开:
interface IEventHandler {
void eventAOccured(EventAData aData);
void eventBOccured(EventBData bData);
}
现在我希望用户能够将事件A的一些数据传递给事件B的钩子,同时保持接口无状态。首先我想的是
interface IEventHandler<U> {
U eventAOccured(EventAData aData);
void eventBOccured(EventBData bData, U userData);
}
不幸的是,由于泛型不提供运行时信息(至少没有反射),API无法调用eventBOccured
,因为在编译时不知道其第二个参数的类型。引入标记接口并U extends IMarker
解决了这个问题,但是没有考虑我想要避免的上传。恕我直言,如果我愿意接受上传,我可以简单地通过Object
并获得同样的结果。
我很确定(Java)泛型是错误的工具。我错过了什么吗?你会如何解决这个问题?
答案 0 :(得分:0)
我会这样做: 包com.stackoverflow.user3590895.questions24098455;
//-------------------------------
package com.stackoverflow.user3590895.questions24098455;
public class EventData implements IEventData{
//default is type A
private int type=IEventData.TYPE_A;
@Override
public int getType() {
System.out.print("Event [type:"+type+"]!");
return type;
}
}
//-------------------------------
package com.stackoverflow.user3590895.questions24098455;
public interface IEventData {
public static char TYPE_A='A';
public static char TYPE_B='B';
public int getType();
}
//-------------------------------
package com.stackoverflow.user3590895.questions24098455;
public interface IEventHandler<U> {
U eventOccured(IEventData data);
}
使用案例 - 拨打活动电话(有您选择的活动) - api catch事件,可以通过调用函数getType来了解他的类型。 - 如果你是eventData B,你可以使用EventData,并为B Type创建一个新的EventData。您可以为EventDataB添加一些特定功能,也可以添加特定数据。
给我反馈。
答案 1 :(得分:0)
如果我正确理解,您可以使用包含其类定义的数据的包装器。像
这样的东西class Wrapper<U extends IMarker> {
U data;
Class<U> clazz;
// constructor, getters and setters omitted
}
您的活动界面将是
interface IEventHandler<U extends IMarker> {
Wrapper<U> eventAOccured(EventAData aData);
void eventBOccured(EventBData, Wrapper<U> user data);
}
这样,Wrapper
类已知,API可以毫无问题地调用它。在eventBOccured
中,你有适合你的上传类型。