Почему getSelectedItem() не является общим для JComboBox?
JCombobox в Java 7 обновлен для использования генериков - я всегда думал, что это немного надзор, что этого еще не было, поэтому мне было приятно видеть это изменение.
Однако, пытаясь использовать JCombobox таким образом, я понял, что методы, которые я ожидал использовать эти общие типы еще только вернули Object.
Почему это так? Мне кажется, это глупое дизайнерское решение. Я понимаю, что базовый ListModel имеет общий getElementAt()
метод, поэтому я буду использовать это вместо этого, но это немного окольный путь что-то похожее на то, что оно могло быть изменено на самом JComboBox.
Ответы
Ответ 1
Я полагаю, вы ссылаетесь на getSelectedItem()
?
Причина в том, что, если поле со списком доступно для редактирования, выбранный элемент не обязательно содержится в модели резервной копии и не ограничивается общим типом. Например. если у вас есть редактируемый JComboBox<Integer>
с моделью [1, 2, 3], вы все равно можете ввести "foo" в компоненте, а getSelectedItem()
вернет строку "foo", а не объект типа Integer.
Если поле со списком недоступно для редактирования, вы всегда можете отнестись к cb.getItemAt(cb.getSelectedIndex())
для обеспечения безопасности типа. Если ничего не выбрано, это вернет null
, что соответствует поведению getSelectedItem()
.
Ответ 2
Вот безопасная версия:
public static <T> T getSelectedItem(JComboBox<T> comboBox)
{
int index = comboBox.getSelectedIndex();
return comboBox.getItemAt(index);
}