我想在接口中声明一个方法,其中实现类中定义的方法的参数可以是特定java类的子类型,例如:
interface Processor{
processRequest( Request r);
}
public class SpecialRequest extends Request{...}
public class SpecialProcessor implements Processor{
processRequest(SpecialRequest r){...}
}
但我在SpecialProcessor中遇到错误,因为它没有正确实现Processor接口。我可以在Processor接口中更改什么以允许SpecialProcessor中的定义工作?
答案 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}}变量/字段,您的类可以分配给该字段。