5

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

interface Processor{
      processRequest( Request r);
}

public class SpecialRequest extends Request{...}

public class SpecialProcessor implements Processor{

      processRequest(SpecialRequest r){...}
}

但我在 SpecialProcessor 中遇到错误,因为它没有正确实现处理器接口。我可以在处理器接口中进行哪些更改以允许 SpecialProcessor 中的定义起作用?

4

2 回答 2

9

您可以键入Processor

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


public class SpecialProcessor implements Processor<SpecialRequest> {
    public void processRequest(SpecialRequest r) {
       ...
    }
}
于 2011-01-27T18:16:36.517 回答
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 不再匹配此绑定,因此无法分配,并且将在编译时正确拒绝。自己处理特殊请求的调用者可以使用一个Processor<SpecialRequest>变量/字段,您的类可以分配给该变量/字段。

于 2011-01-27T18:17:46.387 回答