如果不在 Java 中传递其类型,则无法使用基 class
Cannot use base class without passing its type in Java
我想创建一个公共服务和公共请求,如下所示:
public interface CommonService {
CommandDTO createOrUpdate(CommonRequest request);
}
然后按如下所示实现此服务:
public class CompanyARequest extends CommonRequest {
// properties
}
public class CompanyAServiceImpl implements CommonService {
@Override
public CommandDTO createOrUpdate(CompanyARequest request) {
// ...
}
}
然而,尽管 CompanyARequest
继承自 CommonRequest
,createOrUpdate
方法抛出“方法未覆盖其超类的方法 ”错误.
另一方面,如果我对请求使用泛型,错误就消失了,但是如果我对请求和dto使用泛型,就会使用太多的字母,我只想使用通用字母将在 CommonService
中使用的实体。那么,我该如何解决这个问题?我的实现有什么错误吗?
CompanyAServiceImpl::createOrUpdate
实现仅考虑了由 CommonService::createOrUpdate
定义的整个 space 的一小部分。这就是为什么说 " 方法不会覆盖其 superclass" 的方法(至少不完全如此)。
看到它,想到某个接收参数any CommonService
的方法,例如:
void runService(CommonService commonService) { ... }
runService
如何知道(在编译时)commonService.createOrUpdate
的正确参数是什么?它只知道它必须是 CommonRequest
(或者,传递地,扩展它的 any class)。但是您的 CompanyAServiceImpl::createOrUpdate
实现只支持其中之一。
换句话说,createOrUpdate
必须支持任何 参数,即 CommonRequest
.
你能做的最好的事情取决于你正在寻找的抽象类型(你的问题没有描述要解决的问题)。
但是,您可能正在寻找类似于以下内容的内容:
interface CommonRequest {
String requestDescription();
}
interface CommonService<Request extends CommonRequest> {
String serviceName();
boolean createOrUpdate(Request request);
}
static class CompanyARequest implements CommonRequest {
public String requestDescription() { return "A Req"; }
}
static class CompanyAService implements CommonService<CompanyARequest> {
public String serviceName() { return "A Co"; }
public boolean createOrUpdate(CompanyARequest companyARequest) { return true; }
}
static class CompanyBRequest implements CommonRequest {
public String requestDescription() { return "B Req"; }
}
static class CompanyBService implements CommonService<CompanyBRequest> {
public String serviceName() { return "B Co"; }
public boolean createOrUpdate(CompanyBRequest companyBRequest) { return false; }
}
现在,所有调用 createOrUpdate
的进程都将被迫知道哪个参数是正确的,但所有公司的通用进程仍然可以共享一个实现,例如 运行 日志记录:
static <R extends CommonRequest> void runService(CommonService<R> service, R request) {
System.out.printf("Running service '%s':%n", service.serviceName());
if(service.createOrUpdate(request))
System.out.printf(" - Success with parameter '%s'.%n", request.requestDescription());
else
System.out.printf(" ! Error with parameter '%s'.%n", request.requestDescription());
}
如果我们运行
runService(new CompanyAService(), new CompanyARequest());
runService(new CompanyBService(), new CompanyBRequest());
我们得到
Running service 'A Co':
- Success with parameter 'A Req'.
Running service 'B Co':
! Error with parameter 'B Req'.
当然,所有这些都是如果该参数 (CommonRequest
) 和该方法 (createOrUpdate
) 将在您的应用程序的许多地方通用地使用,否则,只需添加一个新的贵公司方法:
public class CompanyAServiceImpl implements CommonService {
@Override
public CommandDTO createOrUpdate(CompanyRequest request) {
// ...
}
public CommandDTO createOrUpdateWithA(CompanyARequest request) {
// ...
}
}
据我了解,您正在寻找通用接口:
public interface CommonService<C extends CommonRequest> {
CommandDTO createOrUpdate(C request);
}
public class CompanyAServiceImpl implements CommonService<CompanyARequest> {
@Override
public CommandDTO createOrUpdate(CompanyARequest request) {
// ...
}
}
如果您像最初那样定义它,问题是任何 CommonRequest
都应该根据其在接口中的定义被该方法接受。
我想创建一个公共服务和公共请求,如下所示:
public interface CommonService {
CommandDTO createOrUpdate(CommonRequest request);
}
然后按如下所示实现此服务:
public class CompanyARequest extends CommonRequest {
// properties
}
public class CompanyAServiceImpl implements CommonService {
@Override
public CommandDTO createOrUpdate(CompanyARequest request) {
// ...
}
}
然而,尽管 CompanyARequest
继承自 CommonRequest
,createOrUpdate
方法抛出“方法未覆盖其超类的方法 ”错误.
另一方面,如果我对请求使用泛型,错误就消失了,但是如果我对请求和dto使用泛型,就会使用太多的字母,我只想使用通用字母将在 CommonService
中使用的实体。那么,我该如何解决这个问题?我的实现有什么错误吗?
CompanyAServiceImpl::createOrUpdate
实现仅考虑了由 CommonService::createOrUpdate
定义的整个 space 的一小部分。这就是为什么说 " 方法不会覆盖其 superclass" 的方法(至少不完全如此)。
看到它,想到某个接收参数any CommonService
的方法,例如:
void runService(CommonService commonService) { ... }
runService
如何知道(在编译时)commonService.createOrUpdate
的正确参数是什么?它只知道它必须是 CommonRequest
(或者,传递地,扩展它的 any class)。但是您的 CompanyAServiceImpl::createOrUpdate
实现只支持其中之一。
换句话说,createOrUpdate
必须支持任何 参数,即 CommonRequest
.
你能做的最好的事情取决于你正在寻找的抽象类型(你的问题没有描述要解决的问题)。
但是,您可能正在寻找类似于以下内容的内容:
interface CommonRequest {
String requestDescription();
}
interface CommonService<Request extends CommonRequest> {
String serviceName();
boolean createOrUpdate(Request request);
}
static class CompanyARequest implements CommonRequest {
public String requestDescription() { return "A Req"; }
}
static class CompanyAService implements CommonService<CompanyARequest> {
public String serviceName() { return "A Co"; }
public boolean createOrUpdate(CompanyARequest companyARequest) { return true; }
}
static class CompanyBRequest implements CommonRequest {
public String requestDescription() { return "B Req"; }
}
static class CompanyBService implements CommonService<CompanyBRequest> {
public String serviceName() { return "B Co"; }
public boolean createOrUpdate(CompanyBRequest companyBRequest) { return false; }
}
现在,所有调用 createOrUpdate
的进程都将被迫知道哪个参数是正确的,但所有公司的通用进程仍然可以共享一个实现,例如 运行 日志记录:
static <R extends CommonRequest> void runService(CommonService<R> service, R request) {
System.out.printf("Running service '%s':%n", service.serviceName());
if(service.createOrUpdate(request))
System.out.printf(" - Success with parameter '%s'.%n", request.requestDescription());
else
System.out.printf(" ! Error with parameter '%s'.%n", request.requestDescription());
}
如果我们运行
runService(new CompanyAService(), new CompanyARequest());
runService(new CompanyBService(), new CompanyBRequest());
我们得到
Running service 'A Co':
- Success with parameter 'A Req'.
Running service 'B Co':
! Error with parameter 'B Req'.
当然,所有这些都是如果该参数 (CommonRequest
) 和该方法 (createOrUpdate
) 将在您的应用程序的许多地方通用地使用,否则,只需添加一个新的贵公司方法:
public class CompanyAServiceImpl implements CommonService {
@Override
public CommandDTO createOrUpdate(CompanyRequest request) {
// ...
}
public CommandDTO createOrUpdateWithA(CompanyARequest request) {
// ...
}
}
据我了解,您正在寻找通用接口:
public interface CommonService<C extends CommonRequest> {
CommandDTO createOrUpdate(C request);
}
public class CompanyAServiceImpl implements CommonService<CompanyARequest> {
@Override
public CommandDTO createOrUpdate(CompanyARequest request) {
// ...
}
}
如果您像最初那样定义它,问题是任何 CommonRequest
都应该根据其在接口中的定义被该方法接受。