java多个对象作为函数的参数

时间:2017-04-27 06:34:33

标签: java function object arguments

我在java类中有一个函数,它触发一个动作监听器(如下所示):

// action event fired when hitting a checkbox
public void fireActionCheckBox(MyMainClass frame, JCheckBox theButtonExample) {

    for(ActionListener a: theButtonExample.getActionListeners()) {
        a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) {
              //Nothing need go here, the actionPerformed method (with the
              //above arguments) will trigger the respective listener
        });
    }
}

然后我有第二个函数对JButton的动作监听器做同样的事情:

// action event fired when hitting a button
public void fireActionButton(MyMainClass frame, JButton theButtonExample) {

    for(ActionListener a: theButtonExample.getActionListeners()) {
        a.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null) {
              //Nothing need go here, the actionPerformed method (with the
              //above arguments) will trigger the respective listener
        });
    }
}

我理解在java中必须在开始之前分配参数,但是编写两次相同的代码似乎效率低下。有没有更好的方法来做到这一点,他们会允许我不要为一个非常相似的动作编写两个函数。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

public void fireActionCheckBox(MyMainClass frame, AbstractButton button) { ... }

有一个抽象类AbstractButton,它是这两个类的父类。它定义了getActionListeners方法。

此外,您可以以更通用的方式重写该方法:

public <T extends AbstractButton> void fireActionButton(MyMainClass frame, T button) { ... }

答案 1 :(得分:2)

您可以传递方法泛型参数,而不是JCheckBox theButtonExampleJButton theButtonExample。例如,假设两个类都扩展了相同的父级,您可以执行

public <J extends commonParent> void fireActionButton(MyMainClass frame, J j) {
  //...
}

由于@Sweeper在评论中指出,由于父母没有听众,您需要检查类型并执行向下转换

public <J extends JComponent> void fireActionButton(MyMainClass frame, J j) {
  if (j instanceof JComboBox) {
    JCheckbox jbox = (JComboBox)j;
    // Do something else
  }
}

答案 2 :(得分:1)

JCheckBox和JButton都是同一父类的子代:

enter image description here

使用两者的超类定义一个方法:

public void fireActionAbstractButton(MyMainClass frame, AbstractButton myAbstractButton) {
        System.out.println(myAbstractButton.getClass().getName());
    }