java - 具有子类类型的通用接口(interface)实现

标签 java generics interface wildcard

处理器接口(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/

相关文章:

java - CountDownTimer 上的 NullPointerException

java - 如何将控制台的输出显示到 JTextArea

Java 泛型 - 是否可以将 T 限制为可序列化?

Java-未找到通用类型?

java - 传递将两个接口(interface)实现为两个不同子类型的类的实例

java - 如何在 TestNG 中结合 Mockito 和 Spring

java - 我想创建一个全局 MediaPlayer,无论显示哪种布局,它都会继续播放

java - 获取Java中泛型接口(interface)序列化后的类型

java - Lambda 重载方法

php - 如果可以使用接口(interface)和特征,为什么 PHP 有抽象类?