ActionEvent.getSource: 如何正确转换源对象

ActionEvent.getSource: how to cast properly the source Object

恐怕我在这里犯了一个新手错误。我在下面有 ActionListener,但我在 if 语句中收到警告 Unchecked cast: 'java.lang.Object' to 'javax.swing.JComboBox<java.lang.String>'。我该如何解决?我想从 JComboBox API.

中调用一个方法

我对抑制警告不感兴趣。

public class MyActionListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent actionEvent) {
        Object source = actionEvent.getSource();
        JComboBox<String> comboBox;
        if (source instanceof JComboBox) {
            comboBox = (JComboBox<String>) source;
        }
    }

}

要在不抑制的情况下删除警告,您将不得不与泛型妥协并将代码更改为:

JComboBox<?> comboBox;
if (source instanceof JComboBox) {
    comboBox = (JComboBox<?>) source;
}

如果您要使用 JComboBox 中使用通用 <E> 的任何方法,您可以在那里使用转换。例如:

String s = (String) comboBox.getItemAt(0);

解释:

发出警告是因为编译器无法知道您的 JComboBoxJComboBox<String> 还是 JComboBox<Integer>

转换是运行时的事情,Java 中的泛型只是占位符,以确保类型安全并使代码更具可读性。使用类型擦除,编译器 updates/modifies 在生成字节码时所有涉及泛型的语句都带有强制转换语句(更多信息 here)。