Предупреждение Java с использованием векторов: непроверенный вызов для добавления (E)
Оскорбительный бит кода
Vector moves = new Vector();
moves.add(new Integer(x));
Ошибка:
ConnectFour.java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector moves.add(new Integer(x));
Не уверен, сколько информации требуется для такой ошибки....
Ответы
Ответ 1
Проблема в том, что приведенный выше код не использует generics.
Следующее будет работать:
Vector<Integer> moves = new Vector<Integer>();
move.add(new Integer(x));
Имя типа внутри <>
(в случае Vector
, параметр типа E
для удерживаемого элемента) сообщает компилятору, какой тип объекта он должен ожидать.
Если кто-то пытается добавить объект с указанным типом, например, в этом случае, пытаясь добавить String
to и Vector<Integer>
, произойдет ошибка времени компиляции, указывая, что тип объекта который не относится к ожидаемому типу.
Тем не менее, следует стараться не использовать класс Vector
. Для других целей класс, реализующий List
, например ArrayList
из Java Collections Framework было бы достаточно и лучше выполнялось.
Edit
Хотя он не был напрямую связан с вопросом о дженериках, Адам Пэйнтер поднял хороший момент в комментариях об использовании авто-бокса.
Так как Java 5, примитивы и их классы-оболочки, например. int
и Integer
будут автоматически преобразовываться между собой по мере необходимости.
Следовательно, можно добавить значение, указанное как литерал int
или int
, в класс, ожидающий Integer
:
Vector<Integer> v = new Vector<Integer>();
v.add(5); // Not necessary to use an Integer value.
Ответ 2
Это не ошибка, это просто предупреждение компилятора. Вектор обычно параметризован, поэтому, чтобы избавиться от предупреждения, просто используйте generics:
Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
Ответ 3
Если у вас нет другого выбора, кроме использования несистемной структуры данных, вы можете поместить @SuppressWarnings("unchecked")
в начале метода, чтобы отключить предупреждение.
Это делается только в том случае, если у вас нет выбора, кроме как использовать не общий вектор. Обычно это происходит, когда вы работаете со старыми библиотеками или некоторыми частями библиотек времени выполнения Java.
Ответ 4
-
инициализируйте свой вектор следующим образом
Vector<Integer> moves = new Vector<Integer>();
-
Предпочтительно использовать java.util.ArrayList
- это замена Vector
Ответ 5
Не имеет прямого отношения к коду, но рекомендуется использовать (из версии >= 5):
Integer.valueOf(x);
вместо
new Integer(x);
Потому что некоторые целые значения {-128,..., 127) кэшируются, и он всегда будет возвращать один и тот же объект. Это очень полезно, особенно для autoboxing.