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

时间:2011-08-11 12:55:10

标签: java swing generics jcombobox java-7

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

然而,当试图以这种方式使用JCombobox时,我意识到我期望使用这些泛型类型的方法still just return Object.

为什么这个呢?对我来说,这似乎是一个愚蠢的设计决定。我意识到底层的ListModel有一个通用的getElementAt()方法,所以我会用它来代替 - 但它有点迂回的做法,看起来它可能已经在JComboBox本身上被改变了。 / p>

2 个答案:

答案 0 :(得分:57)

我想你是指getSelectedItem()

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

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

答案 1 :(得分:1)

这是一个类型安全的版本:

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