与基类和子类"not applicable for the arguments"相关的 Java 泛型



我确实发现了一些关于一般问题的类似帖子,但没有一篇以我能理解的方式捕捉到我的问题。我希望有人能帮助我解决这个问题。

我尝试了很多方法,比如从不同的地方删除"?extends",玩"?super",看看另一个错误是否会给我指明解决方案的方向。

以下代码:

final ResponseBase response = executor.execute(myRequest);

出现以下编译器错误:"CommandExecutor类型中的方法execute(捕获#6-of?extends RequestBase)不适用于参数(RequestBase)"

完整的代码列表:

public class MainClass {
    private final static Map<Class<? extends RequestBase>, CommandExecutor<? extends RequestBase, ? extends ResponseBase>> MAP = new HashMap<>();
    public static void main(String[] args) {
        final DummyCommandExecutor dummyCommandExecutor = new DummyCommandExecutor();
        MAP.put(MyRequest.class, dummyCommandExecutor);
        final RequestBase myRequest = new MyRequest();
        myRequest.setRequestString("this is my request");
        final CommandExecutor<? extends RequestBase, ? extends ResponseBase> executor = MAP.get(myRequest.getClass());
        final ResponseBase response = executor.execute(myRequest);
        System.out.println(response.getResponseString());
    }
}
interface CommandExecutor<T, R> {
    R execute(T object);
}
class DummyCommandExecutor implements CommandExecutor<MyRequest, MyResponse> {
    @Override
    public MyResponse execute(MyRequest request) {
        final MyResponse response = new MyResponse();
        response.setResponseString(request.getRequestString());
        return response;
    }
}
class MyResponse extends ResponseBase {
}
class ResponseBase {
    String responseString;
    public String getResponseString() {
        return this.responseString;
    }
    public void setResponseString(String responseString) {
        this.responseString = responseString;
    }
}
class MyRequest extends RequestBase {
}
class RequestBase {
    String requestString;
    public String getRequestString() {
        return this.requestString;
    }
    public void setRequestString(String requestString) {
        this.requestString = requestString;
    }
}

如果不进行强制转换,就无法做到这一点。虽然您知道映射会为给定类型返回正确的命令执行器,但编译器不会,因此您需要告诉编译器不要在意:

final CommandExecutor<RequestBase,ResponseBase> executor = (CommandExecutor) MAP.get(myRequest.getClass());

您不能直接匹配吗?带T

一个选项就是:

final CommandExecutor executor = MAP.get(myRequest.getClass());

当然,在哪个选项中,如果映射返回smth,则可以获得运行时异常

最新更新