ActionEvent.getSource: как правильно привести исходный объект - PullRequest
3 голосов
/ 27 марта 2020

Боюсь, что я могу сделать здесь новую ie ошибку. У меня есть ActionListener ниже, но я получаю предупреждение Unchecked cast: 'java.lang.Object' to 'javax.swing.JComboBox<java.lang.String>' внутри оператора if. Как я могу решить это? Я хочу вызвать метод из 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;
        }
    }

}

1 Ответ

3 голосов
/ 27 марта 2020

Чтобы удалить предупреждение без подавления, вам придется пойти на компромисс с обобщениями и изменить код на:

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

И если вы собираетесь использовать любой метод из JComboBox, который использует обобщенный c <E>, вы можете использовать там кастинг. Например:

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

Объяснение:

Предупреждение было выдано, поскольку компилятор не может узнать, является ли ваш JComboBox JComboBox<String> или JComboBox<Integer>.

Приведение - это среда выполнения, а обобщенные значения в Java являются просто заполнителями для обеспечения безопасности типов и повышения читабельности кода. Используя Type Erasure, компилятор обновляет / изменяет все операторы, включающие обобщенные выражения, с операторами приведения при генерации байтового кода (дополнительная информация здесь ).

...