java - это - отличия serializable и parcelable




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

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

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

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

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


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

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