gpt4 book ai didi

Java 泛型 : capture cannot be applied to Object

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:56:45 25 4
gpt4 key购买 nike

我的代码有一个 Map 的 (Message)Handlers。我正在尝试使处理程序通用化(如接口(interface)处理程序所见)。如果没有泛型,处理程序都需要从 Object 转换为相应的类,最好避免这种情况(但一切正常)。对于每个消息类(下面的 Foo),我都有一个处理程序类。

如何将任何类型的类映射到任何类型的处理程序,并“仅”使用一个对象获取/调用? (不能限制handleMessage(Object)的参数)

请参阅下面的 MWE。

import java.util.*;
public class Logic
{
Map<Class<?>, Handler<?>> handlers = new HashMap<Class<?>, Handler<?>>();

public void run()
{
handlers.put(Foo.class, new FooHandler());
}

public void handleMessage(Object msg)
{
Handler<?> handler = handlers.get(msg.getClass());
if (handler != null) {
handler.execute(msg);
}
}

private interface Handler<T>
{
public void execute(T msg);
}

private class FooHandler implements Handler<Foo>
{
public void execute(Foo msg) {}
}

private class Foo {}
}

此代码产生:

Logic.java:16: execute(capture#x of ?) in Logic.Handler cannot be applied > to (java.lang.Object) handler.execute(msg);

如何在保持 Handler 接口(interface)通用的同时修复它以使其正常工作?

最佳答案

您不能在字段中定义键和值之间的关系,但您可以使用访问器方法来强制执行它,前提是只有这些方法用于访问映射。

private final Map<Class, Handler> handlers = new HashMap<Class, Handler>();

public <T> void addHandler(Class<T> clazz, Handler<T> handler) {
handlers.put(clazz, handler);
}

@SuppressWarnings("unchecked")
public <T> Handler<T> getHandler(Class<T> clazz) {
return (Handler<T>) handlers.get(clazz);
}

@SuppressWarnings("unchecked")
public <T> Handler<T> getHandlerFor(T t) {
return getHandler((Class<T>) t.getClass());
}

public void run() {
addHandler(Foo.class, new FooHandler());
}

public <T> void handleMessage(T msg) {
Handler<T> handler = getHandlerFor(msg);
if (handler != null) {
handler.execute(msg);
}
}

关于Java 泛型 : capture cannot be applied to Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8311235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com