2015-02-27 5 views
0

У меня есть ArrayList, и мне нужна копия значений, а не ссылки.глубокая копия ArrayList()

То, что я пытался до сих пор:

ArrayList<AudioInputStream> copy = new ArrayList<AudioInputStream>(original); 
Collections.copy(copy, original); 

Я предполагаю, что это своего рода копии называются мелкие копии, поскольку AudioInputStream является Object. Я читал, что простой способ глубокой копии использует конструкторы, но я не мог понять, как это сделать в моем случае.

+7

Вы не можете копировать или клонировать InputStream. InputStreams предназначены для чтения только один раз, а не для копирования без их чтения. –

+0

Зачем вам нужно копировать список InputStream? –

+0

@PeterLawrey благодарит за подсказку. – Quantum

ответ

0

Когда мы говорим о глубокой копии с помощью конструктора, мы должны создать что-то вроде этого:

public class Foo { 
    public Foo(Foo aFoo) { 
    //your deep copy here 
    } 
} 

Тогда, это легко цикла по списку и создавать новые объекты.

List<Foo> newList = /* whatever */; 
for(Foo foo : fooLists) { 
    newList.add(new Foo(foo)); 
} 

Однако это не разрешено AudioInputStream, кроме того, факт клонирования InputStream довольно странно.
Можете ли вы просто создать еще один InputStream из того же источника?

+0

Разве у него не было бы ссылки на исходное foo, даже если бы вы сказали новый foo, что это foo? – IByrd

+0

Этот ответ не учитывает тот факт, что вопрос относится к определенному типу класса, который не предоставляет такой конструктор. – Bobulous

+0

@ BIyrd Целями этого конструктора являются создание нового foo в соответствии со старыми атрибутами foo, поэтому в конце нет ссылки на старый foo :) – NiziL