【问题标题】:How to use generics of generics in java interfacesjava接口中如何使用泛型的泛型
【发布时间】:2015-02-06 21:07:13
【问题描述】:

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

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

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

}

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

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

提前致谢。

【问题讨论】:

    标签: java generics interface


    【解决方案1】:

    要正确实现MyService 接口,您必须提供与类型参数匹配的泛型方法getResponse。但是,您隐式放置了类型参数 DummyResponseDummyRequest,并且没有像 MyServicegetResponse 方法那样声明类型参数 RT

    这里的解决方案是将类型参数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;
        }
    
    }
    

    【讨论】:

    • 感谢您的回答,我知道我可以做到这一点,但是通过这种方法,我必须使用具有通用定义的接口。我只想在方法级别使用泛型。 MyService 必须保持 MyService,而不是 MyService
    • 想一想。如果一个接口说实现者必须提供一个接受 R 和 T 的任何有效组合的方法,那么如何实现该接口来创建一个只接受一个特定组合的类? Java 泛型不是模板工具,现在忘记语法看起来一样,您会省去很多挫败感。
    • @oko 问题是如果泛型必须存在于接口中的方法上,那么所有具体的类都必须在实现方法上有泛型。所有具体类都需要采用任何类型的 Response 和任何类型的 Request 与之关联。这里在非泛型接口上设计泛型方法是不正确的;正确的设计是使用通用接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多