当前位置: 首页 > 知识库问答 >
问题:

如何编写一个接受类类型作为参数的方法,并使用它强制转换一些对象

邵繁
2023-03-14

我正在使用JavaFX8开发一个Java8桌面应用程序。
我在MainApp类(扩展application类的类)中有这个方法。

public void showUserLayout() {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainApp.class.getResource("view/userLayout.fxml"));
        AnchorPane userPane = (AnchorPane) loader.load();

        rootAnchorPane.getChildren().clear();
        rootAnchorPane.getChildren().add(userPane);

        userLayoutController controller = loader.getController();
        controller.setMainApp(this);
    } catch (IOException e) {
        // Handle Exception
    }
}
public void genericLayoutLoader(String fxmlFilename, Class rootFXMLElement, Class fxmlController) {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(MainApp.class.getResource(fxmlFilename));
        // Not sure for the Object below
        Object chooseUserAndInterval = (rootFXMLElement) loader.load();
        // rootAnchorPane is same for every layout
        rootAnchorPane.getChildren().clear();
        rootAnchorPane.getChildren().add((rootFXMLElement) chooseUserAndInterval);

        Object controller = (fxmlController) loader.getController();
        ((fxmlController)controller).setMainApp(this);
    } catch (IOException e) {
        // Handle Exception
    }
}

我会这样使用它:

public void showUserLayout() {
    genericLayoutLoader("view/userLayout.fxml", AnchorPane, userLayoutController);  
}

有什么方法可以实现这种行为吗?

共有1个答案

越福
2023-03-14

如果您想坚持使用类作为参数,那么您的代码应该类似于以下内容:

    public void genericLayoutLoader(String fxmlFilename, Class rootFXMLElement, Class fxmlController) {
        try {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(MainApp.class.getResource(fxmlFilename));
            // Not sure for the Object below
            Object chooseUserAndInterval = loader.load();
            // rootAnchorPane is same for every layout
            rootAnchorPane.getChildren().clear();
            rootAnchorPane.getChildren().add(chooseUserAndInterval);

            Object controller = loader.getController();
            fxmlController.getMethod("setMainApp", new Class[] { MainApp.class }).invoke(controller, this);
        } catch (IOException e) {
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
    }

    public void showUserLayout() {
        genericLayoutLoader("view/userLayout.fxml", AnchorPane.class, Controller.class);  
    }

但是,如果可能的话,我仍然建议尝试使用接口来解决这个问题。

 类似资料:
  • 问题内容: 我有以下两节课: 和: 当我运行测试时,一切都是笨拙的。如果我将类型参数化更改为: 编译器抱怨,报告: 错误:类型不兼容的整数不能转换为T number = new Integer(11); 其中T是类型变量T扩展了在方法getSomeValue(boolean)中声明的Object 它同样对Double有所抱怨。为什么? 编辑:我犯了一个错误。这实际上是有效的代码。 现在我明白了@S

  • 有一些东西让我困惑,我没有找到关于VM规范的太多信息。这有点晦涩,如果有人能给我解释一下就好了。 这几行代码...... ..... 生成此输出: 浮动:无限 int: 2147483647 短:-1 字节:-1 、和是8位、16位和32位,带有两个补码和是32位和64位的IEEE 754(参见此处)。 根据我的理解,最大值的意味着尾数的所有位(52位)都切换到1。因此,转换为短或字节返回-1,即

  • 我正在编写一个名为Launchable的界面。Launchable接口指定了三个方法:launch(),不带参数且不返回值;isAbleToFly(),不带参数且不返回true或false;以及land(),不带参数且不返回值。 这是我为isAbleToFly尝试的: 但它说非法启动类型返回真的吗?

  • 问题内容: 我正在写一个方法,该方法应接受不共享除父对象以外的父类型的两种类型之一的对象作为其参数。例如,类型为Dreams和Garlic。您可以同时和。我想有一个方法,可以将Dreams和Garlic都接受为其参数。 Garlic和dreams都是某些库的一部分,因此让它们实现ICrushable接口(以便我可以编写)是不可行的。 我的方法主体很长,因此重载将意味着复制代码。丑陋。我确定我可以使