首页 > 解决方案 > ActionEvent.getSource:如何正确转换源对象

问题描述

我担心我可能会在这里犯一个新手错误。我有以下内容,但我在声明中ActionListener收到警告。我该如何解决?我想从API 调用一个方法。Unchecked cast: 'java.lang.Object' to 'javax.swing.JComboBox<java.lang.String>'ifJComboBox


我对压制警告不感兴趣。

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;
        }
    }

}

标签: javaswingcastingactionlistenerjcombobox

解决方案


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

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

如果你打算使用任何JComboBox使用 generic 的方法<E>,你可以在那里使用强制转换。例如:

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

解释:

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

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


推荐阅读