繁体   English   中英

超类但不是所有子类的Java泛型都想要定义一个类型参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM