java如何设计这种方法的签名
我需要定义一个方法,它接受请求并返回响应:
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定义中的哪一个?或者有更合适的方法来定义它
非常感谢
# 1 楼答案
你必须把你的
Request
链接到你的Response
例如,将
MyRequest
类更改为现在你的
HolidayRequest
看起来像:现在,您的方法签名可以强制
MyReponse
对应: