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

时间:2015-02-06 21:07:14

标签: java generics interface

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

假设我们有一个请求和响应对象。每个请求类型都必须绑定到响应类型,因此我们可以处理响应类型的请求。

abstract class Response {

}    

abstract class Request<R extends Response> {

}

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

class DummyResponse extends Response {

}

class DummyRequest extends Request<DummyResponse> {

}

好的,我们有实施。让我们深入了解界面,我在哪里努力:

interface MyService {

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

}

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

class MyServiceImpl implements MyService {

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

}

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

如何使用界面执行此操作?或者这是一种错误的方法?这样做的真正方法是什么?

提前致谢。

1 个答案:

答案 0 :(得分:4)

要正确实现MyService接口,必须提供与类型参数匹配的通用方法getResponse。但是,您隐式放置类型参数DummyResponseDummyRequest,并且您不会将类型参数RT声明为MyService&#39 ; s getResponse方法。

此处的解决方案是将类型参数RT移动到界面本身。

interface MyService<R extends Response, T extends Request<R>> {
    R getResponse(T request);
}

然后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;
    }

}