繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM