[英]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.