[英]Generic Interface implementation with subclass type
处理器接口:
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;
}
}
请求 class:
public class Request {
private long id;
...
}
文本请求
public class TextRequest extends Request {
String text;
...
}
总机 class:
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
更改为正确的类型。
首先,您需要返回正确的类型 class。
public Class<?> getRequestType();
成为
public Class<T> getRequestType();
(编辑:现在已在原始问题中对此进行了修改。)
然后我们需要读取正确类型的请求 object。 对于任何特定的 object ?
这里将引用特定类型。 我们可以通过引入一种新方法来捕捉这一点。
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 generics 在编译时检查。
所以当你写Processor<?> processor = processors.get("proc name");
我们不知道如何验证请求?
.
如果您可以接受这一点 - 尝试使用非通用版本的处理器:
Processor processor = new TextProcessor();
否则可能会为Processor
接口添加一些约束( void process(Request request);
)?
您在Processor<?> processor = processors.get("proc name");
中获得的处理器被参数化为未知类型,与processor.getRequestType()
中的类型没有共同之处。 我不清楚 generics 在这种情况下给你带来了什么好处。 似乎您不必知道主 function 中的具体Request
子类型是什么,因此可以在没有 generics 的情况下重写所有内容。问题的根本原因是processors
map,其中所有处理器都在一堆中。
我可以想象 generics 的好处,例如,当处理器 map 将实现为异构 map 时,键类型和值类型之间存在某种关联。 然后Processor.getRequestType
也必须通过类型T
进行参数化,然后您可以使用:
public static void main(String[] args) {
Processor<TextRequest> processor = processors.get(TextRequest.class);
TextRequest request = objectMapper.readValue(json, processor.getRequestType());
processor.process(request);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.