2013-11-22 2 views
3
public void addProductList(ArrayList<ViewOrderProduct> globalOrderProductList) { 

    this.productOrderList = (ArrayList<ViewOrderProduct>)globalOrderProductList.clone(); 
} 

Это дает мне предупреждение:Предупреждения клонирования ArrayList в Java

Тип безопасность: Переполнение отлито из объекта в ArrayList

Я знаю, что я могу просто решить эту проблему, добавив @SuppressWarnings("unchecked").

Но я хочу понять проблему. Я могу быть уверен, что все будет хорошо, если я добавлю suppressWarnings? Есть ли еще одно решение для этого предупреждения?

+0

Это просто предупреждение для вас, потому что он не может проверить во время выполнения, что только объекты ViewOrderProduct находятся в вашем клонированном списке. –

+0

Вы действительно не хотите использовать метод 'clone' ... –

+1

Почему бы и нет @Luiggi? – GVillani82

ответ

7

clone() возвращает Object по умолчанию, правильный способ клонировать ArrayList это использовать соответствующий конструктор:

this.productOrderList = new ArrayList<ViewOrderProduct>(globalOrderProductList); 

Edit: Предпочтительный способ заключается в использовании подходящего конструктора, и оба метода возвращают только мелкую копия в любом случае.

Редактировать: И нет другого способа, которым я знаю, чтобы удалить предупреждение, используя clone() без SuppressWarning.

+0

Это даст вам мелкую копию, а не глубинную копию. Это, конечно, зависит от потребностей ОП. –

+1

@LuiggiMendoza 'clone()' on 'ArrayList' также возвращает неглубокую копию. – Neet

+0

См. Ссылки, которые я опубликовал в вопросе OP об использовании метода «clone». –

0

arraylist - это оболочка по объекту [], что-либо внутри хранится как объект, неважно, какой конструктор будет использован, результат будет таким же.

, как указано выше, evoid предупреждение вам следует использовать конструктор общественного ArrayList (Collection с) {}

например новый ArrayList (globalOrderProductList);

это вернет копию содержимого без предупреждений.