【问题标题】: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】:

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

      如果你想这样做,你需要向接口添加一个通用参数,如下所示:

      interface Processor<R extends Request> {
          void processRequest(R r);
      }
      
      public class SpecialProcessor implements Processor<SpecialRequest> {
      
          public void processRequest(SpecialRequest r) { ... }
      
      }
      

      这样,想要传递“正常”请求的调用者必须声明Processor&lt;Request&gt; 类型的变量/字段 - 并且您的 SpecialProcessor 不再匹配此绑定,因此无法分配,并且将在编译时。自己处理特殊请求的调用者可以使用Processor&lt;SpecialRequest&gt; 变量/字段,您的类可以分配给该变量/字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 2012-04-28
        • 2016-07-21
        相关资源
        最近更新 更多