处理器接口(interface):
public interface Processor<T> {
public void process(T request);
public Class<T> getRequestType();
}
处理器实现:
public class TextProcessor extends BaseProcessor implements Processor<TextRequest> {
@Override
public void process(TextRequest request) {
// TODO Auto-generated method stub
}
@Override
public Class<TextRequest> getRequestType() {
// TODO Auto-generated method stub
return TextRequest.class;
}
}
请求类:
public class Request {
private long id;
...
}
文本请求
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 = ...;
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);
}
关于java - 具有子类类型的通用接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365944/