Подтвердить что ты не робот

Предупреждение 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));

Не уверен, сколько информации требуется для такой ошибки....

4b9b3361

Ответ 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.