有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    你必须把你的Request链接到你的Response

    例如,将MyRequest类更改为

    public abstract class MyRequest<T extends MyResponse> {
    

    现在你的HolidayRequest看起来像:

    public class HolidayRequest extends MyRequest<HolidayResponse> {
    

    现在,您的方法签名可以强制MyReponse对应:

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