[英]Java generics on super class but not all subclasses want to define a type parameter
我不知道怎么称得这么好...我希望灵感会在以后出现,我可以更新它,但......
让我用一些(伪)代码来描述:
我试图在我的服务器上以一种整洁的方式处理AJAX请求,这就是我想出的。
基本要求:
public abstract class BaseRequest<T> {
private final T details;
public BaseRequest(T details) {
this.details = details;
}
public abstract void process();
}
然后我有一个处理一些数据的请求,让我们说它是一个登录请求,其中LoginDetails
是一个bean:
public class LoginRequest extends BaseRequest<LoginDetails> {
public LoginRequest(T details) {
super(details);
}
/**
* @Override
*/
public void process() {
Toolbox.login(this.details);
}
}
这已经很好了直到现在...我有各种请求,我将表单数据绑定到bean并使用Futures将它们传递给这些请求。 一切都很好......直到......
我决定发出退出请求。 这个请求不需要绑定到bean的数据,因此我不希望定义一个类型参数(eeeek它会破坏)。 我想要做的是这样的事情:
public class LogoutRequest extends BaseRequest {
public LogoutRequest() {
super(null);
}
/**
* @Override
*/
public void process() {
Toolbox.logout();
}
}
虽然这确实可以编译和工作,但由于类型安全,它会使我的皮肤爬行。
现在......我知道如何解决这个问题,但我想知道是否有更好的方法。
我的解决方案
将有一个无类型的基本请求和一个类型化的子类,数据请求子类和注销请求只是子类化无类型的基本请求。
无类型的基本请求:
public abstract class BaseRequest {
public abstract void process();
}
键入的基本数据请求:
public abstract class BaseDataRequest<T> extends BaseRequest {
private final T details;
public BaseDataRequest(T details) {
this.details = details;
}
}
然后登录:
public class LoginRequest extends BaseDataRequest<LoginDetails> {
public LoginRequest(T details) {
super(details);
}
/**
* @Override
*/
public void process() {
Toolbox.login(this.details);
}
}
并注销:
public class LogoutRequest extends BaseRequest {
/**
* @Override
*/
public void process() {
Toolbox.logout();
}
}
我只是想确保我的解决方案是最好的选择,我没有错过某种方式来指定NULL类型(我知道这个概念不存在)或类似的东西。 有人可以帮我确认一下。
此外,我正在为该问题的更新标题提出建议。
考虑到某种类型的null,你在正确的轨道上。 Java中不存在这样的东西,但Java确实包含Void
类 。
Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。
您可以创建类型参数Void
,以便在调用超类构造函数时只能传递null
。
public class LogoutRequest extends BaseRequest<Void> {
public LogoutRequest() {
super(null);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.