父类(super class)上的 Java 泛型但并非所有子类都想定义类型参数

标签 java

我不知道如何很好地命名这个......我希望灵感会在以后出现并且我可以更新它,但是......

让我用一些(伪)代码来描述一下:

我正在尝试以一种整洁的方式处理我的服务器上的 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);
    }

}

到目前为止,这一直运行良好......我有各种请求,我将表单数据绑定(bind)到 bean 并使用 Futures 将它们传递给这些请求。一切都很好……直到……

我决定发出注销请求。此请求不需要将数据绑定(bind)到 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 确实包含 the Void class .

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.

您可以将类型参数设置为Void,这样在调用父类(super class)构造函数时只能传递null

public class LogoutRequest extends BaseRequest<Void> {

    public LogoutRequest() {
        super(null);
    }
}

关于父类(super class)上的 Java 泛型但并非所有子类都想定义类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111493/

相关文章:

java - 是否可以对 Apache Spark 中的所有工作人员执行命令?

java - 如何覆盖 Jersey 2.23 中的内置异常映射器?

java - 如何在java中使用opengl中的字体?

java - 我如何在 teamcity 上发布 gradle 来发布使用 Maven 插件的 gradle 构建?

java - Android - 如何以编程方式截取屏幕截图

java - 在 AST Visitor 中,我如何知道我正在访问哪个节点的属性?

java - IntelliJ 默认 hashCode() 实现的说明

java - Files.createTempDirectory ("") 抛出 NullPointerException

java - 比使用大量 setter/getter 更好的方法/设计

java - 如何将 ActionListener 添加到模态 JDialog?