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);
解释:
发出警告是因为编译器无法知道您的 JComboBox
是 JComboBox<String>
还是 JComboBox<Integer>
。
转换是运行时的事情,Java 中的泛型只是占位符,以确保类型安全并使代码更具可读性。使用类型擦除,编译器 updates/modifies 在生成字节码时所有涉及泛型的语句都带有强制转换语句(更多信息 here)。
恐怕我在这里犯了一个新手错误。我在下面有 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);
解释:
发出警告是因为编译器无法知道您的 JComboBox
是 JComboBox<String>
还是 JComboBox<Integer>
。
转换是运行时的事情,Java 中的泛型只是占位符,以确保类型安全并使代码更具可读性。使用类型擦除,编译器 updates/modifies 在生成字节码时所有涉及泛型的语句都带有强制转换语句(更多信息 here)。