Безопасность типов с JCombobox на Java 7 - PullRequest
2 голосов
/ 10 ноября 2011

Я не могу избавиться от одного нового предупреждения о безопасности типов в java7.

У меня определен следующий объект JCombobox

private JComboBox<Integer> combobox_current_year;

И конструктор

combobox_current_year = new JComboBox(options.getList_years().toArray());

Java 7 теперь выдает мне следующее предупреждение:

Безопасность типов: для выражения типа JComboBox требуется непроверенное преобразование для соответствия JComboBox

После изменения кода на

combobox_current_year = new JComboBox<Integer>((Integer[]) options.getList_years().toArray());

Я получаю следующее исключение:

Исключение в потоке "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..EventQueue.dispatchEventImpl (EventQueue.java:705) в java.awt.EventQueue.access $ 000 (EventQueue.java:101) в java.awt.EventQueue $ 3.run (EventQueue.java:666) в java.awt.Eueue.run (EventQueue.java:664) в java.security.AccessController.doPrivileged (собственный метод) в java.security.ProtectionDomain $ 1.doIntersectionPrivilege (ProtectionDomain.java:76) в java.awt.EventQueue.dispatchEjue (EventQ:675) в java.awt. Event.isp.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:113) в java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:105)at java.awt.EventDispatchThread.run (EventDispatchThread.java:90)

Ответы [ 3 ]

5 голосов
/ 10 ноября 2011

попробуйте выполнить

combobox_current_year = new JComboBox<Integer>(options.getList_years().toArray(new Integer[0])); 

. ToArray структуры коллекции всегда возвращает Object [], если вам нужен определенный тип массива, вам нужно предоставить один

5 голосов
/ 10 ноября 2011

Проблема в том, что метод toArray() возвращает объект типа Object[], который совершенно другого типа отличается от Integer[] (поэтому приведение не выполняется).Вы должны передать массив с другим типом в toArray(…), чтобы решить это.Наиболее эффективный метод получения массива из списка:

List<Integer> tmp = options.getList_years();
combobox_current_year = new JComboBox<Integer>(
        tmp.toArray(new Integer[tmp.size()]));

Я использую временную переменную для хранения списка, потому что я хочу предварительно изменить размер массива, чтобы значения можно было просто скопировать.внутрь.Передача в более короткий массив (например, длины 0) также будет работать, но вызовет дополнительное выделение.(Вы можете заставить его работать, сохраняя массив нулевой длины в поле private static; он эффективно неизменен, поэтому вы можете делиться им без каких-либо вредных последствий. Но я предпочитаю предварительный размер, так как это оставляет меньше беспорядка на уровне класса.)

2 голосов
/ 10 ноября 2011

Полагаю, это означает, что options.getList_years() возвращает List<?>.

. Это означает, что вам нужно преобразовать объект [] в целое число [], что должно быть сделано с помощью операции копирования.

Object[] years = options.getList_years().toArray();
new JComboBox(Arrays.copyOf(years, years.length, Integer.class));
...