Не удается сбросить предупреждения Java при клонировании вектора - PullRequest
3 голосов
/ 15 сентября 2010

У меня есть два вектора, объявленных как свойство частного класса:

private Vector<Myobject> v1 = new Vector<Myobject>();
private Vector<Myobject> v2 = new Vector<Myobject>();

Я заполняю v1 кучей Myobjects.

Мне нужно сделать мелкий клон v1 в v2,Я пытался:

v2 = v1.clone();

Я получаю "непроверенные или небезопасные операции".

Я перепробовал все формы приведения и не могу преодолеть это предупреждение.

Дажеесли я удалю вторую (v2) декларацию и попробую просто клонировать:

Vector<Myobject> v2 = v1.clone();

или

Vector<Myobject> v2 = ( Vector<Myobject> ) v1.clone();

... все равно получу.

ЯЯ уверен, что я упускаю что-то очень простое здесь ...

Заранее спасибо

Ответы [ 3 ]

5 голосов
/ 15 сентября 2010

Компилятор всегда будет выдавать предупреждение при приведении непараметризованного типа (такого как Object, возвращаемый clone()) в параметризованный. Это потому, что целевой тип Vector<Myobject> дает гарантии не только о себе, но и об объектах, содержащихся в нем. Однако проверить эти гарантии невозможно во время выполнения, поскольку информация о параметре типа стерта.

Более подробное объяснение см. Здесь.

Как упоминалось ранее, если вы просто пытаетесь сделать копию вектора v1, правильный способ сделать это - использовать конструктор копирования.

Vector<Myobject> v2 = new Vector<Myobject>(v1);

Полученный клон будет неглубоким, поскольку при этом будут скопированы только ссылки Myobject с v1 на v2.

3 голосов
/ 15 сентября 2010

Попробуйте использовать вместо этого конструктор копирования:

Vector<Myobject> v2 = new Vector<Myobject>(v1);
2 голосов
/ 15 сентября 2010

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

В этих случаях вы можете добавить аннотацию SuppressWarnings над своим заданием:

@SuppressWarnings("unchecked")
Vector<Myobject> v2 = (Vector<Myobject>) v1.clone();
...