如何在java接口中使用泛型的泛型

oko*_*oko 1 java generics interface

我正在尝试为我的基本服务编写一个通用接口。这是我尝试过的:

假设我们有一个请求和响应对象。每个请求类型都必须绑定一个响应类型,这样我们才能处理请求的响应类型。

abstract class Response {

}    

abstract class Request<R extends Response> {

}
Run Code Online (Sandbox Code Playgroud)

现在让我们写一些关于它们的实现:

class DummyResponse extends Response {

}

class DummyRequest extends Request<DummyResponse> {

}
Run Code Online (Sandbox Code Playgroud)

好的,我们有实现。让我们深入研究界面,我在那里挣扎:

interface MyService {

   <R extends Response, T extends Request<R>> R getResponse(T request);

}
Run Code Online (Sandbox Code Playgroud)

当我实现这个 MyService 时,我遇到了错误:

class MyServiceImpl implements MyService {

    //these method gives me error
    @Override
    public DummyResponse getResponse(DummyRequest request) {
        //do sth
        return response;
    }

}
Run Code Online (Sandbox Code Playgroud)

那我为什么要这样做?因为我想用自己的请求和响应对象编写很多服务实现,所以我可以从一个点来处理它们——服务接口。

我如何使用接口来做到这一点?或者这是一个错误的方法?这样做的真正方法是什么?

提前致谢。

rge*_*man 5

要MyService正确实现接口,您必须提供getResponse与类型参数匹配的泛型方法。但是,您将隐式类型参数DummyResponse和DummyRequest,和你不声明类型的参数R和T作为MyService的getResponse方法做。

这里的解决方案是将类型参数R,并T在接口本身。

interface MyService<R extends Response, T extends Request<R>> {
    R getResponse(T request);
}
Run Code Online (Sandbox Code Playgroud)

然后MyServiceImpl可以MyService在实现它时提供类型参数,并且getResponse可以使用这些类型参数来成功实现该getResponse方法。

class MyServiceImpl implements MyService<DummyResponse, DummyRequest> {

    // This now implements MyService correctly. 
    @Override
    public DummyResponse getResponse(DummyRequest request) {
        //do sth
        return response;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 再往上想一想。如果一个接口说实现者必须提供一个方法来接受 R 和 T 的任何有效组合,那么该接口的实现如何制作一个只接受一个特定组合的类?Java 泛型不是模板工具,现在忘记语法看起来是一样的,你会省去很多挫折。 (2认同)
  • @oko问题是,如果泛型必须存在于接口中的方法上,那么所有具体类都必须在实现方法上具有泛型。所有具体的类都需要采用任何类型的“响应”和与之关联的任何类型的“请求”。非泛型接口上的泛型方法设计在这里是不正确的;正确的设计是使用通用接口。 (2认同)