Java 为什么不是';是否在JComboBox generic上设置getSelectedItem()?

Java 为什么不是';是否在JComboBox generic上设置getSelectedItem()?,java,swing,generics,jcombobox,java-7,Java,Swing,Generics,Jcombobox,Java 7,Java 7中的JCombobox已经更新为使用泛型——我一直认为这有点疏忽,因为它还没有更新,所以我很高兴看到这一变化 然而,当试图以这种方式使用JCombobox时,我意识到我期望的方法使用这些泛型类型 这到底是为什么?对我来说,这似乎是一个愚蠢的设计决定。我意识到底层有一个通用的getElementAt()方法,所以我将使用它来代替它-但这是一种迂回的方式,似乎它可以在JComboBox本身上进行更改。我想您指的是getSelectedItem() 原因是,如果组合框是可编辑的,则所选项目

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

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


这到底是为什么?对我来说,这似乎是一个愚蠢的设计决定。我意识到底层有一个通用的
getElementAt()
方法,所以我将使用它来代替它-但这是一种迂回的方式,似乎它可以在JComboBox本身上进行更改。

我想您指的是
getSelectedItem()

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


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

类型安全版本相同:

public static <T> T getSelectedItem(JComboBox<T> comboBox)
{
    int index = comboBox.getSelectedIndex();
    return comboBox.getItemAt(index);
}
publicstatict getSelectedItem(JComboBox组合框)
{
int index=comboBox.getSelectedIndex();
返回comboBox.getItemAt(索引);
}

可能+1Java7@mKorbel也许我遗漏了一些东西,但是线程的哪一部分解释了这一点呢?在API中,我看不到Java6和Java7之间的变化,也看不到这一点,这是很有意义的——在内存耗尽之后,我忘记了JComboxes的可编辑部分。很可能是因为它们在我的应用程序中都不可编辑!你在那里描述的方法就是我一直在使用的方法——它看起来像是一种迂回的方法,但现在我明白了原因。你不需要确定某个项目是否被选中。如果
getItemAt
被赋予无效值(例如-1),它将返回
null
。如果没有选择任何内容,这与
getSelectedItem()
的行为相同。@DuncanJones:你说得对。未经检查,我假设getItemAt在使用无效索引调用时会抛出IllegalArgumentException、IndexArrayOutOfBoundsException或类似的东西。@jarnbjo这绝对是不寻常的行为。如果我需要依赖它,我会在代码中添加一条注释。如果我有一个可编辑的组合框,我想如果它是一个有效的整数,我可以合理地期望我只能键入一个自定义值。因此,我更希望他们给我们提供某种转换器接口,将字符串与组合框中的类型进行转换。但出于某种原因,设计API的人并不喜欢类型安全。他们也没有更新JFormattedTextField。