为什么JComboBox上的getSelectedItem()不是通用的?

2022-08-31 19:58:30

Java 7中的JCombobox已经更新为使用泛型 - 我一直认为这是一个疏忽,因为它还没有,所以我很高兴看到这个变化。

但是,当尝试以这种方式使用JCombobox时,我意识到我期望使用这些泛型类型的方法仍然只是返回Object。

这到底是为什么呢?对我来说,这似乎是一个愚蠢的设计决定。我意识到底层的ListModel有一个通用的方法,所以我会用它来代替 - 但它是一种迂回的方式,可以做一些事情,看起来好像可以在JComboBox本身上改变。getElementAt()


答案 1

我想你指的是?getSelectedItem()

原因是,如果组合框是可编辑的,则所选项目不一定包含在后备模型中,也不约束为泛型类型。例如,如果您有一个带有模型[1,2,3]的可编辑对象,您仍然可以在组件中键入“foo”,并将返回字符串“foo”而不是整数类型的对象。JComboBox<Integer>getSelectedItem()

如果组合框不可编辑,则始终可以遵从 以实现类型安全。如果未选择任何内容,则将返回 ,这与 相同的行为。cb.getItemAt(cb.getSelectedIndex())nullgetSelectedItem()


答案 2

下面是一个类型安全的版本:

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

推荐