Class<SomeObject<?>> 不是 Class<SomeObject<SpecificObject>> 的超类?

时间:2021-06-17 16:13:18

标签: java generics

编辑 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)轻松解决

0 个答案:

没有答案
相关问题