Почему getSelectedItem () не является универсальным в JComboBox? - PullRequest
48 голосов
/ 11 августа 2011

JCombobox в Java 7 был обновлен для использования дженериков - я всегда думал, что это было своего рода упущением, которого не было, поэтому я был рад видеть это изменение.

Однако, пытаясь использовать JCombobox таким образом, я понял, что методы, которые я ожидал использовать эти универсальные типы , по-прежнему просто возвращают Object.

С какой стати это? Это кажется глупым дизайнерским решением для меня. Я понимаю, что базовый ListModel имеет общий метод getElementAt(), поэтому я буду использовать его вместо этого - но это немного обходной способ сделать что-то, что выглядит так, как будто его можно было изменить в самом JComboBox.

Ответы [ 2 ]

58 голосов
/ 11 августа 2011

Полагаю, вы ссылаетесь на getSelectedItem()?

Причина в том, что если поле со списком доступно для редактирования, выбранный элемент не обязательно содержится в вспомогательной модели и не ограничен универсальным типом.Например, если у вас есть редактируемый JComboBox<Integer> с моделью [1, 2, 3], вы все равно можете ввести «foo» в компоненте, и getSelectedItem() вернет строку «foo», а не объект типа Integer.

Если поле со списком недоступно для редактирования, вы всегда можете выбрать cb.getItemAt(cb.getSelectedIndex()) для обеспечения безопасности типов.Если ничего не выбрано, это вернет null, что соответствует поведению getSelectedItem().

1 голос
/ 03 декабря 2017

Вот типобезопасная версия:

public static <T> T getSelectedItem(JComboBox<T> comboBox)
{
    int index = comboBox.getSelectedIndex();
    return comboBox.getItemAt(index);
}
...