Предупреждение Java с использованием векторов: необязательный вызов для добавления (E) - PullRequest
24 голосов
/ 03 декабря 2009

Оскорбительный бит кода

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));

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

Ответы [ 5 ]

31 голосов
/ 03 декабря 2009

Проблема в том, что код выше не использует generics .

Будет работать следующее:

Vector<Integer> moves = new Vector<Integer>();

move.add(new Integer(x));

Имя типа внутри <> (в случае Vector, параметр типа E для элемента для хранения) сообщает компилятору, какой тип объекта он должен ожидать.

Если попытаться добавить объект указанного типа, например, в этом случае, при попытке добавить String к и Vector<Integer>, произойдет ошибка времени компиляции, указывающая, что тип объекта это не относится к ожидаемому типу добавляется.

Тем не менее, следует стараться не использовать класс Vector. Для других целей было бы достаточно класса, реализующего List, такого как ArrayList из Java Collections Framework , и более производительного.

Редактировать

Хотя это и не имеет прямого отношения к вопросу о дженериках, Адам Пейнтер поднял хороший комментарий в комментариях об использовании автобокса.

Начиная с Java 5, примитивы и их классы-оболочки, например, int и Integer будут автоматически преобразованы между собой при необходимости.

Следовательно, можно добавить значение, указанное как int или литерал int в класс, ожидающий Integer:

Vector<Integer> v = new Vector<Integer>();
v.add(5);    // Not necessary to use an Integer value.
5 голосов
/ 03 декабря 2009

Это не ошибка, это просто предупреждение компилятора. Вектор обычно параметризован, поэтому, чтобы избавиться от предупреждения, просто используйте дженерики:

Vector<Integer> moves = new Vector<Integer>();
moves.add(new Integer(x));
3 голосов
/ 03 декабря 2009

Если у вас нет выбора, кроме как использовать неуниверсальную структуру данных, вы можете поставить @SuppressWarnings("unchecked") в начале метода, чтобы отключить предупреждение.

Это можно сделать, только если у вас нет выбора, кроме как использовать неуниверсальный вектор. Это обычно происходит, когда вы работаете со старыми библиотеками или определенными частями библиотек времени выполнения Java.

1 голос
/ 03 декабря 2009
  1. инициализируйте ваш вектор следующим образом

    Vector<Integer> moves = new Vector<Integer>();
    
  2. Предпочтительно использовать java.util.ArrayList - это замена Vector

0 голосов
/ 03 декабря 2009

Не имеет прямого отношения к коду, но рекомендуется использовать (с версии> = 5):

Integer.valueOf(x);

вместо

new Integer(x);

Поскольку некоторые целочисленные значения {-128, ..., 127) кэшируются , и он всегда будет возвращать один и тот же объект. Это очень полезно, особенно в отношении autoboxing .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...