Массивы имеют полиморфное поведение - только универсальные типы не имеют.
То есть, если Uri
реализует Parcelable
, то
Вы МОЖЕТЕ сказать:
Parcelable[] pa = new Uri[size];
Uri[] ua = (Uri[]) pa;
Вы НЕ МОЖЕТЕ сказать:
List<Parcelable> pl = new ArrayList<Uri>();
Как видите, мы можем привести pa
обратно к Uri[]
. Тогда в чем проблема? Это ClassCastException
происходит, когда ваше приложение убито, а затем сохраненный массив воссоздается. Когда он воссоздается, среда выполнения не знает, какой это был массив (Uri[]
), поэтому он просто создает Parcelable[]
и помещает в него элементы. Следовательно, ClassCastException
, когда вы пытаетесь привести его к Uri[]
.
Обратите внимание, что исключение не возникает (теоретически), когда процесс не прерывается и первоначально созданный массив (Uri[]
) повторно используется между раундами сохранения / восстановления состояния. Например, когда вы меняете ориентацию.
Я просто хотел уточнить, ПОЧЕМУ это произошло. Если вы хотите, чтобы решение @solo предоставило достойное решение.
Приветствия