编辑 1:根据 this,尽管 SomeObject<?>
确实是 SomeObject<Foo>
的超类,但 Class<SomeObject<?>>
不是 Class<SomeObject<Foo>>
的超类。如何解决这一具体问题的问题仍然存在。 (可能向 Message<T>
类添加一个返回 Class<Message<T>>
的方法?)
原始问题:
所以基本上我有一个通用的 Message<T>
类,它实现了一个众所周知的设计模式,称为 Command pattern(有一个转折:不是用引用构建一个对象,引用作为参数传递execute(T objectToCallMethodsOn)
) 看起来像这样:
public abstract class Message<T> {
void execute(T obj); //e.g. DoSomethingOnFooMessage implements Message<Foo> to do something on a Foo object
}
以便我可以执行以下操作:
public DoSomethingOnFooMessage implements Message<Foo> {
@Override
void execute(Foo obj) {
obj.doSomething(); //doSomething is a method of the Foo class
}
}
现在,我还尝试使用内部映射(E 是类型参数)Class<Message<E>>
映射到对象 E executableObject
(如前面示例中的 Foo)和两个方法:一个 handleMessage(Message> msg) 应该做一个 Message 的动态实例(因此需要 Class<> 对象让你做一个动态的 instanceof 然后一个动态转换)并在中寻找正确的 executableObject映射在正确的对象上调用消息的 execute(E obj)
(如果它存在,否则消息将被丢弃),以及一个 addProcessor()
来添加例如的条目Class<Message<Foo>>, Foo
到地图:
public class MessageProcessor {
private final Map<Class<Message<?>>, Object> map;
public MessageProcessor() {
map = new HashMap<>();
}
public <E> void addProcessor(Class<Message<E>> messageClass, E executable) {
map.put(messageClass, executable);
}
...
}
到目前为止,这就是我所写的,但 IDE 抱怨 Class<Message<E>>
已给出,但 Class<Message<?>>
中需要 addProcessor()
,我不知道为什么; afaik,SomeClass<?>
应该是任何 SomeClass<SpecificClass>
的超类,为什么 Class<SomeObject<?>>
和 Class<SomeObject<SpecificObject>>
不一样?
对不起,这个问题太冗长了,除了问一个关于泛型超类的问题,我还问你们(也许)一种不同的、更优雅的方式来做我想做的事情,那就是找到运行时消息的类,以便我可以使用我在 execute()
中注册的对象作为其输入来调用它的 addProcessor()
。
另外,我认为这可以通过原始类型(ew)轻松解决