在Java 7上使用JCombobox键入安全性

And*_*tag 2 java swing jcombobox java-7

我无法在java7中删除一个新的类型安全警告.

我定义了以下JCombobox对象

private JComboBox<Integer> combobox_current_year;
Run Code Online (Sandbox Code Playgroud)

和构造函数

combobox_current_year = new JComboBox(options.getList_years().toArray());
Run Code Online (Sandbox Code Playgroud)

Java 7现在给我以下警告:

类型安全:JComboBox类型的表达式需要未经检查的转换以符合JComboBox

将代码更改为

combobox_current_year = new JComboBox<Integer>((Integer[]) options.getList_years().toArray());
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

线程"AWT-EventQueue-0"中的异常java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.Integer; 在jamm.gui.FinanzmanagerGui.mainWindow(FinanzmanagerGui.java:123)在jamm.StartJamm $ 1.run(StartJamm.java:43)在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)在java.awt中.EventQueue.dispatchEventImpl(EventQueue.java:705)在java.awt.EventQueue.access $ 000(EventQueue.java:101)在java.awt.EventQueue中$ 3.run(EventQueue.java:666)在java.awt.EventQueue中$ 3 .RUN(EventQueue.java:664)在java.security.AccessController.doPrivileged(本机方法)在java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76)在java.awt.EventQueue.dispatchEvent(EventQueue.java: 675)java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)at java. awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)在java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

rat*_*eak 5

试着做

combobox_current_year = new JComboBox<Integer>(options.getList_years().toArray(new Integer[0])); 
Run Code Online (Sandbox Code Playgroud)

如果你想要一个特定的数组类型,那么集合框架的toArray总是会返回一个Object []


Don*_*ows 5

问题是该toArray()方法返回的类型对象Object[]是一个完全不同的类型Integer[](因此使得转换失败).您必须传入一个不同类型的数组toArray(…)来解决这个问题.从列表中获取数组的最有效方法是:

List<Integer> tmp = options.getList_years();
combobox_current_year = new JComboBox<Integer>(
        tmp.toArray(new Integer[tmp.size()]));
Run Code Online (Sandbox Code Playgroud)

我使用临时变量来保存列表,因为我想预先调整数组大小,以便可以将值复制到其中.传入较短的数组(例如,长度为0)也可以工作,但会导致额外的分配.(你可以通过将长度为零的数组保存在private static字段中来使其工作;它实际上是不可变的,因此你可以分享它而不会产生任何不良后果.但我更喜欢预先调整大小,因为这样会在类级别上留下更少的混乱.)