如果不在 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 继承自 CommonRequestcreateOrUpdate 方法抛出“方法未覆盖其超类的方法 ”错误.

另一方面,如果我对请求使用泛型,错误就消失了,但是如果我对请求和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 都应该根据其在接口中的定义被该方法接受。