【问题标题】:declare parameter subtype in Java interface, use subtypes in Java implementing methods在 Java 接口中声明参数子类型,在 Java 实现方法中使用子类型
【发布时间】:2011-06-16 18:00:19
【问题描述】:
我想在接口中声明一个方法,其中实现类中定义的方法的参数可以是特定java类的子类型,例如:
interface Processor{
processRequest( Request r);
}
public class SpecialRequest extends Request{...}
public class SpecialProcessor implements Processor{
processRequest(SpecialRequest r){...}
}
但我在 SpecialProcessor 中遇到错误,因为它没有正确实现处理器接口。我可以在处理器接口中进行哪些更改以允许 SpecialProcessor 中的定义起作用?
【问题讨论】:
标签:
java
generics
interface
methods
extends
【解决方案1】:
你可以输入Processor:
public interface Processor<R extends Request> {
void processRequest(R r);
}
public class SpecialProcessor implements Processor<SpecialRequest> {
public void processRequest(SpecialRequest r) {
...
}
}
【解决方案2】:
没错 - 请记住,调用者不应该知道正在使用的接口的具体实现。他们只知道他们可以将Request(any请求)传递给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> 变量/字段,您的类可以分配给该变量/字段。