检查整个数组是否为instanceof

时间:2014-03-03 09:38:21

标签: java swing generics

我想要一个通用方法,但是我不确定它是否适用于这种情况,我也不太熟悉Generic的工作方式(如果有人能给我一个好的教程或文章,我非常感谢它)。

但是,我想创建一个处理JComponents初始化的方法,如果JComponents数组是All JRadioButtons,则要发送到另一个方法。

public void initializeComponent(JComponent...components)
{
     if(components[0] instanceof JRadioButton)
         initializeJRadioButtons(components[]);
}

但是,这只会检查第一个是否是JRadioButton,我觉得Generics可以更好地处理这个问题,但有没有办法检查所有组件是否都是JRadioButtons而没有循环?

如果有人这样做的话。

JRadioButton[] radioButtons = new JRadioButton[2];
...
initializeComponent(radioButtons);

4 个答案:

答案 0 :(得分:3)

不,你不能在没有循环的情况下检查它们。考虑任何可以为你做的过程 - 在某些时候它仍然需要逐个检查它们,因为它们是不同的对象。

但是,您可以使用方法重载。你可以有一个签名为

的方法
public void initializeComponent(JRadioButton...components)

然后您知道这些组件中的每一个都是单选按钮,因此可以跳过任何检查。

然后,您可以使用您已经在问题中获得的方法,可能必须检查每个组件以进行正确的初始化。

public void initializeComponent(JComponent...components)

答案 1 :(得分:1)

我不知道循环组件的问题是什么:

boolean isRadioButtons = true;
for (Component c : components) {
    if (!(c instanceof JRadioButton)) {
        isRadioButtons = false;
        break;
    }
}

答案 2 :(得分:1)

由于您只想检查传递的数组是否实际上是JRadioButton[]数组,因此可以使用以下代码。虽然这是一个黑客,但这样做的工作:

public static void initializeComponent(JComponent... components) throws ClassNotFoundException {
    // Get the Class instance for an array of type JRadioButton.
    Class<?> clazz = Class.forName("[Ljavax.swing.JRadioButton;");

    if (clazz.isInstance(components)) { 
        System.out.println(true);
        initializeJRadioButtons((JRadioButton[]) components);
    }
}

该方法使用JRadioButton数组的编码来获取该类型数组的Class实例。有关详细信息,请参阅Class#forName()

如果componentsJRadioButton[]的实例,那么您将获得true作为结果。请记住,正如我已经说过的那样,这只是一个黑客攻击。 IMO,重载是您的最佳选择。

答案 3 :(得分:0)

不,没有内置的方法来检查数组中的所有条目是否属于特定的子类型类型。

循环它。