首页 > 解决方案 > 在 Java 中避免泛型的冗余参数

问题描述

我正在为我的 JavaFX 应用程序创建一个帮助程序类,如下所示:

public class ViewHelper<T extends Parent, U extends Controller> {
    private static final String FXML_EXTENSION = ".fxml";
    private final Class<? extends Controller> clazz;
    private FXMLLoader loader;
    private T t;

    public ViewHelper(Class<? extends Controller> clazz) throws IOException {
        this.clazz = clazz;
        this.load();
    }

    private void load() throws IOException {
        this.loader = new FXMLLoader(fxmlUrl());
        this.t = this.loader.load();
    }

    private URL fxmlUrl() {
        return clazz.getResource(clazz.getSimpleName() + FXML_EXTENSION);
    }

    public T component() {
        return t;
    }

    public U controller() {
        return loader.getController();
    }
}

用法是:

var viewHelper = new ViewHelper<BorderPane, MainController>(MainController.class);
BorderPane borderPane = viewHelper.component();
MainController mainController = viewHelper.controller();

它实际上有效并实现了我想要的。但是,看到我必须通过MainController两次,而它们始终相同,这让我很恼火。没有实例表明它们不一样。在创建实例期间如何避免其中之一ViewHelper

代替:

var viewHelper = new ViewHelper<BorderPane, MainController>(MainController.class);

我更喜欢这样的东西:

var viewHelper = new ViewHelper<BorderPane>(MainController.class);

或者:

var viewHelper = new ViewHelper<BorderPane, MainController>();

谢谢你的帮助。

标签: javagenerics

解决方案


您可以添加要调用的静态方法而不是构造函数。

public static <T extends Parent, U extends Controller> ViewHelper<T, U> of(Class<T> componentType, Class<U> controllerType) throws IOException {
    return new ViewHelper<T, U>(controllerType);
}

然后你这样称呼它:

var viewHelper = ViewHelper.of(BorderPane.class, MainController.class);

推荐阅读