在Java接口中声明参数子类型,在Java实现方法中使用子类型

时间:2011-01-27 18:13:33

标签: java generics interface methods extends

我想在接口中声明一个方法,其中实现类中定义的方法的参数可以是特定java类的子类型,例如:

interface Processor{
      processRequest( Request r);
}

public class SpecialRequest extends Request{...}

public class SpecialProcessor implements Processor{

      processRequest(SpecialRequest r){...}
}

但我在SpecialProcessor中遇到错误,因为它没有正确实现Processor接口。我可以在Processor接口中更改什么以允许SpecialProcessor中的定义工作?

2 个答案:

答案 0 :(得分:9)

您可以输入Processor

public interface Processor<R extends Request> {
    void processRequest(R r);
}


public class SpecialProcessor implements Processor<SpecialRequest> {
    public void processRequest(SpecialRequest r) {
       ...
    }
}

答案 1 :(得分:3)

这是对的 - 请记住,调用者不应该知道正在使用的接口的具体实现。他们只知道他们可以将Request任何请求)传递给processRequest,而您的实现会对参数施加更严格的约束,导致某些方法调用不会是类型正确的。

如果你想这样做,你需要在界面中添加一个通用参数,如下所示:

interface Processor<R extends Request> {
    void processRequest(R r);
}

public class SpecialProcessor implements Processor<SpecialRequest> {

    public void processRequest(SpecialRequest r) { ... }

}

这样,想要传递“普通”请求的调用者必须声明类型为Processor<Request>的变量/字段 - 并且您的SpecialProcessor不再匹配此边界,因此无法分配,并且将正确在编译时被拒绝。正在处理特殊请求的呼叫者可以使用{<1}}变量/字段,您的类可以分配给该字段。