如何在 java 接口中使用泛型的泛型
How to use generics of generics in java interfaces
我正在尝试为我的基本服务编写通用接口。这是我尝试过的:
假设我们有一个请求和响应对象。每个请求类型必须绑定一个响应类型,这样我们才能处理请求的响应类型。
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;
}
}
那我为什么要这样做?因为我想写很多有自己的请求和响应对象的服务实现,所以我可以从一个点来处理它们——服务接口。
如何使用接口来做到这一点?或者这是一个错误的方法?这样做的真正方法是什么?
提前致谢。
要正确实现 MyService
接口,您必须提供一个与类型参数匹配的泛型方法 getResponse
。但是,您隐式放置了类型参数 DummyResponse
和 DummyRequest
,并且您没有将类型参数 R
和 T
声明为 MyService
的 [=13] =] 方法。
这里的解决方案是将类型参数 R
和 T
移动到接口本身。
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;
}
}
我正在尝试为我的基本服务编写通用接口。这是我尝试过的:
假设我们有一个请求和响应对象。每个请求类型必须绑定一个响应类型,这样我们才能处理请求的响应类型。
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;
}
}
那我为什么要这样做?因为我想写很多有自己的请求和响应对象的服务实现,所以我可以从一个点来处理它们——服务接口。
如何使用接口来做到这一点?或者这是一个错误的方法?这样做的真正方法是什么?
提前致谢。
要正确实现 MyService
接口,您必须提供一个与类型参数匹配的泛型方法 getResponse
。但是,您隐式放置了类型参数 DummyResponse
和 DummyRequest
,并且您没有将类型参数 R
和 T
声明为 MyService
的 [=13] =] 方法。
这里的解决方案是将类型参数 R
和 T
移动到接口本身。
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;
}
}