繁体   English   中英

如何设计此方法的签名

[英]How to design the signature of this method

我需要定义一个方法,该方法接受一个请求并返回一个响应:

  public MyResponse submit(MyRequest request){                      A
      ....
  }

这看起来很简单。 然而:

MyRequest可以有许多子类

 public class HolidayRequest extends MyRequest {}
 public class FundingRequest extends MyRequest {}
 public class BudgetRequest extends MyRequest {}

这同样适用于响应类:

 public class HolidayResponse extends MyResponse {}
 public class FundingResponse extends MyResponse {}
 public class BudgetResponse extends MyResponse {}

该方法的用户submit可以通过在任何类型的请求,并获得相应的响应对象,例如:在HolidayRequest传递将返回HolidayResponse。

尽管上面仍然定义的接口工作,用户必须投的返回值submit从MyResponse到一个特定的响应类型。

然后,我认为将方法更改为:

  public <T extends MyResponse, S extends MyRequest>                B
  T submit(S request){
      ....
  }

这使返回类型可以是特定类型,而不是父类型。 但是,用户仍然可以编写如下代码:

  HolidayResponse response = submit(new FundingRequest());

并且代码仍将编译,但在运行时失败。

然后,我意识到Submit方法不需要知道请求的类型,因此无需为MyRequest使用类型参数,我想我可以将其进一步简化为:

  public <T extends MyResponse>                                    C
  T submit(MyRequest request){
      ....
  }

但是同样,该问题与上面提到的问题相同,用户可以传递请求类型并期望其他响应类型。

我的问题是如何正确定义此方法的签名? 您将使用上面A,B和C定义中的哪一个? 还是可能有更合适的方法来定义它?

非常感谢你。

您必须将您的Request到您的Response

例如,将MyRequest类更改为

public abstract class MyRequest<T extends MyResponse> {

现在,您的HolidayRequest如下所示:

public class HolidayRequest extends MyRequest<HolidayResponse> {

现在,您的方法签名可以强制MyReponse进行MyReponse

public <R extends MyResponse, S extends MyRequest<R>> R submit(S request){

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM