具有子类类型的通用接口实现

问题描述 投票:0回答:2

处理器接口:

public interface Processor<T> {

    public void process(T request);

    public Class<?> getRequestType();
}

处理器实现:

public class TextProcessor extends BaseProcessor implements Processor<TextRequest> {

@Override
public void process(TextRequest request) {
    // TODO Auto-generated method stub

}

@Override
public Class<?> getRequestType() {
    // TODO Auto-generated method stub
    return TextRequest.class;
}

}

请求类别:

public class Request {
    private long id;

    ...
}

TextRequest

public class TextRequest extends Request {
    String text;
    ...
} 

主类:

private Map<String, Processor<? extends Request>> processors;

public static void main(String[] args) {

    Processor<?> processor = processors.get("proc name");
    Request request = objectMapper.readValue(json, processor.getRequestType());

    processor.process(request);
}

我在process调用中遇到编译错误。

The method process(capture#10-of ?) in the type Processor<capture#10-of ?> is not applicable
for the arguments (Request)

我该如何解决此问题?

java generics interface wildcard
2个回答
0
投票
因此,当您编写Processor<?> processor = processors.get("proc name");时,我们不知道如何根据?验证请求。

如果可以接受,请尝试使用非通用版本的处理器:

Processor processor = new TextProcessor();

否则可能会为Processor接口(void process(Request request);)添加一些约束吗?


0
投票
Processor<?> processor = ...; Request request = ...; processor.process(request);

但是process被声明为

public void process(T request);

[Request不能保证是T的子类型,因此将无法编译。

您需要将Request更改为正确的类型。

首先,您需要返回正确的类类型。

public Class<?> getRequestType();

成为

public Class<T> getRequestType();

然后,我们需要读取正确类型的请求对象。对于任何特定对象?,此处将引用特定类型。我们可以通过引入一种新方法来捕获它。

public static void main(String[] args) {
    doProcess(processors.get("proc name"));
}
private static <T> void doProcess(Processor<T> processor) {
    T request = objectMapper.readValue(json, processor.getRequestType());
    processor.process(request);
}
© www.soinside.com 2019 - 2024. All rights reserved.