java что Я не понимаю, почему это ClassCastException происходит




отличия serializable и parcelable (4)

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

Причиной этого является тип Safety, JVM просто не может гарантировать, что содержимое вашего массива может быть отправлено в Uri, без необходимости проходить через них, поэтому вы должны их повторять и отбирать отдельно.

В принципе, поскольку Parcelable может быть унаследован другими объектами, нет гарантии, что Array содержит только объекты Uri . Однако приведение к супертипу будет работать с тех пор, когда безопасность типов будет в порядке.

// Application ...
Intent i = new Intent();
i.putExtra(EXTRA_FILE_UPLOAD_URIS, mGalleryAdapter.getItems()); 

Uri[] getItems() { return mItems; }

// Service ...
intent.getParcelableArrayExtra(EXTRA_FILE_UPLOAD_URIS); //works, returns Parcelable[]
Uri[] uris = (Uri[])intent.getParcelableArrayExtra(EXTRA_FILE_UPLOAD_URIS);
// ... Breaks with ClassCastException

Почему бросок на Uri[] ломается, когда Uri является Parcelable ?


Используйте этот метод, он работает для меня.

Parcelable[] ps = getIntent().getParcelableArrayExtra();
Uri[] uri = new Uri[ps.length];
System.arraycopy(ps, 0, uri, 0, ps.length);

Массивы имеют полиморфное поведение - только общие типы не имеют.

То есть, если Uri реализует Parcelable тогда

ты можешь сказать:

Parcelable[] pa = new Uri[size];
Uri[] ua = (Uri[]) pa;

вы НЕ МОЖЕТЕ сказать:

List<Parcelable> pl = new ArrayList<Uri>();

Как вы видите, мы можем вернуть pa обратно в Uri[] . Тогда в чем проблема? Это ClassCastException происходит, когда ваше приложение убито, а затем сохраненный массив воссоздается. Когда он воссоздается, среда выполнения не знает, какой тип массива ( Uri[] ), поэтому он просто создает Parcelable[] и помещает в него элементы. Следовательно, ClassCastException при попытке ClassCastException его Uri[] .

Обратите внимание, что исключение не происходит (теоретически), когда процесс не убит, и первоначально созданный массив ( Uri[] ) повторно используется между раундами сохранения состояния / восстановления. Например, когда вы меняете ориентацию.

Я просто хотел пояснить, ПОЧЕМУ это случилось. Если вы хотите, чтобы решение @solo было достойным.

ура


Я думаю, что происходит следующее:

class Parent { }

class MaleParent extends Parent { }

class FemaleParent extends Parent { }

Если сценарий является чем-то таким, как указано выше, то во время выполнения не будет выполнено следующее:

Parent[] parents = new FemaleParent[]{};
MaleParent[] maleParents = (MaleParent[]) parents;

Что-то вроде этого не вызывает исключения:

Parent[] parents = new MaleParent[]{};
MaleParent[] maleParents = (MaleParent[]) parents;




parcelable