处理器接口:
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)
我该如何解决此问题?
Processor<?> processor = processors.get("proc name");
时,我们不知道如何根据?
验证请求。如果可以接受,请尝试使用非通用版本的处理器:
Processor processor = new TextProcessor();
否则可能会为Processor
接口(void process(Request request);
)添加一些约束吗?
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);
}