2010-09-15 1 views
3

У меня есть два вектора, объявленные как класс собственность частная:не может пролить Java предупреждения при клонировании вектора

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

... до сих пор получить его.

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

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

ответ

5

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

See here for a a more detailed explanation.

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

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

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

+0

+1 хороший ответ. возникла проблема с клонированием Vector за последний час. – kjy112

+0

Ничего, но конструктор Vector не синхронизирован, по крайней мере, в старых версиях Java. Метод clone синхронизирован.Таким образом, они не совсем то же самое. В большинстве случаев ваше решение в порядке :) – Tomasz

2

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

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

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

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

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

Ну, это не похоже на что-то не так с _clone_ методом :) (ничего не знаю) –

+0

У клона могут быть ненадежные результаты (в зависимости от того, кто написал реализацию и какой подход они взяли), поэтому лучше избегать клонирования в во многих случаях, и в этом случае он более аккуратный. – pstanton

+0

Похоже, что конструктор копирования не синхронизирован (Java 5 и старше), но метод клонирования. Попробуйте это;) – Tomasz